void p3dp_print_atom_quartet_info (int iw, int l, int k, int j, int i, int lrank, int krank, int jrank, int irank) { double dxkj[4], dxij[4], angle, normal[4], dxlk[4], dxjk[4], dihedral; double sl[3], sk[3], sj[3], si[3]; p3dp_s(sl, l, lrank); p3dp_s(sk, k, krank); p3dp_s(sj, j, jrank); p3dp_s(si, i, irank); angle = p3dp_atom_triplet_s(sk, sj, si, dxkj, dxij); print_atom_pair_info_s(iw, i, j, irank, jrank, si, sj); if (IS_MANAGER) printf ("bond angle = %g degrees.\n", RADIAN_TO_DEGREE(angle)); print_atom_pair_info_s(iw, k, j, krank, jrank, sk, sj); V3CROSS (dxkj, dxij, normal); normal[3] = V3LENGTH2 (normal); angle = p3dp_atom_triplet_s(sl, sk, sj, dxlk, dxjk); if (IS_MANAGER) printf ("bond angle = %g degrees.\n", RADIAN_TO_DEGREE(angle)); print_atom_pair_info_s(iw, l, k, lrank, krank, sl, sk); /* right-handed helix gives positive dihedral angle */ if ( (normal[3]>0) && (dxlk[3]>0) ) dihedral = acos( V3DOT(normal,dxlk)/sqrt(normal[3])/sqrt(dxlk[3]) ) - PI / 2; else dihedral = 0; if (IS_MANAGER) printf ("dihedral angle = %g degrees.\n", RADIAN_TO_DEGREE(dihedral)); return; }
/* use pointer device to rotate (via magic sphere) */ bool pointer_rotate (int iw, int to_x, int to_y) { double a[3], b[3], c[3], R[3][3]; mgs ( n[iw].lx - AX_size[iw].width/2., n[iw].ly - AX_size[iw].height/2., n[iw].mgs_radius, a ); mgs ( to_x - AX_size[iw].width/2., to_y - AX_size[iw].height/2., n[iw].mgs_radius, b ); V3CROSS (a, b, c); if (V3LENGTH2(c) < MIN_RADIAN*MIN_RADIAN) return (FALSE); M3geodesic (b, a, R); rotate (iw, R); n[iw].lx = to_x; n[iw].ly = to_y; return (TRUE); } /* end pointer_rotate() */
void print_atom_quartet_info (int iw, int l, int k, int j, int i) { double dxkj[4], dxij[4], angle, normal[4], dxlk[4], dxjk[4], dihedral; angle = atom_triplet (k, j, i, dxkj, dxij); print_atom_pair_info (iw, i, j); printf ("bond angle = %g degrees.\n", RADIAN_TO_DEGREE(angle)); print_atom_pair_info (iw, k, j); V3CROSS (dxkj, dxij, normal); normal[3] = V3LENGTH2 (normal); angle = atom_triplet (l, k, j, dxlk, dxjk); printf ("bond angle = %g degrees.\n", RADIAN_TO_DEGREE(angle)); print_atom_pair_info (iw, l, k); /* right-handed helix gives positive dihedral angle */ if ( (normal[3]>0) && (dxlk[3]>0) ) dihedral = acos( V3DOT(normal,dxlk)/sqrt(normal[3])/sqrt(dxlk[3]) ) - PI / 2; else dihedral = 0; printf ("dihedral angle = %g degrees.\n", RADIAN_TO_DEGREE(dihedral)); return; } /* end print_atom_quartet_info() */