<s> '''<STR_LIT>''' <EOL> import math <EOL> def sq_distance ( a , b ) : <EOL> return ( a [ <NUM_LIT:0> ] - b [ <NUM_LIT:0> ] ) ** <NUM_LIT:2> + ( a [ <NUM_LIT:1> ] - b [ <NUM_LIT:1> ] ) ** <NUM_LIT:2> + ( a [ <NUM_LIT:2> ] - b [ <NUM_LIT:2> ] ) ** <NUM_LIT:2> <EOL> def angular_rmsd ( a , b ) : <EOL> return math . sqrt ( ( angular_increment ( a - b ) ** <NUM_LIT:2> ) . sum ( ) / len ( a ) ) <EOL> def to_0_2PI_range ( angle ) : <EOL> """<STR_LIT>""" <EOL> if angle >= <NUM_LIT:0> : <EOL> return angle <EOL> else : <EOL> return ( <NUM_LIT:2> * math . pi ) + angle ; <EOL> def angular_increment ( angle1 , angle2 ) : <EOL> return min ( angle1 - angle2 , to_0_2PI_range ( angle1 ) - to_0_2PI_range ( angle2 ) ) <EOL> def angular_distance ( angle1 , angle2 ) : <EOL> """<STR_LIT>""" <EOL> return min ( abs ( angle1 - angle2 ) , abs ( to_0_2PI_range ( angle1 ) - to_0_2PI_range ( angle2 ) ) ) <EOL> def calc_dihedral ( a1_coords , a2_coords , a3_coords , a4_coords ) : <EOL> xa , ya , za = a1_coords <EOL> xb , yb , zb = a2_coords <EOL> xc , yc , zc = a3_coords <EOL> xd , yd , zd = a4_coords <EOL> v1 = xc - xd <EOL> v2 = yb - yc <EOL> v3 = xb - xc <EOL> v4 = yc - yd <EOL> v5 = v3 * v4 - v1 * v2 <EOL> v6 = ya - yb <EOL> v7 = xa - xb <EOL> v8 = v7 * v2 - v3 * v6 <EOL> v9 = za - zb <EOL> v10 = zb - zc <EOL> v11 = v3 * v9 - v7 * v10 <EOL> v12 = v6 * v10 - v2 * v9 <EOL> v13 = <NUM_LIT:1> / math . sqrt ( v8 * v8 + v12 * v12 + v11 * v11 ) <EOL> v14 = <NUM_LIT:1> / math . sqrt ( v3 * v3 + v2 * v2 + v10 * v10 ) <EOL> v15 = zc - zd ; <EOL> v16 = v1 * v10 - v3 * v15 <EOL> v17 = v2 * v15 - v4 * v10 <EOL> v18 = <NUM_LIT:1> / math . sqrt ( pow ( v5 , <NUM_LIT:2> ) + pow ( v17 , <NUM_LIT:2> ) + pow ( v16 , <NUM_LIT:2> ) ) <EOL> return math . atan2 ( ( v13 * v14 * v11 * v10 - v8 * v2 * v13 * v14 ) * v18 * v17 + ( v3 * v8 * v13 * v14 - v13 * v14 * v12 * v10 ) * v18 * v16 + v5 * ( v2 * v13 * v14 * v12 - v3 * v13 * v14 * v11 ) * v18 , v13 * v12 * v18 * v17 + v13 * v11 * v18 * v16 + v8 * v5 * v13 * v18 ) </s>
