def compute_dihedrals(traj, indices, periodic=True, opt=True): """Compute the dihedral angles between the supplied quartets of atoms in each frame in a trajectory. Parameters ---------- traj : Trajectory An mtraj trajectory. indices : np.ndarray, shape=(n_dihedrals, 4), dtype=int Each row gives the indices of four atoms which together make a dihedral angle. The angle is between the planes spanned by the first three atoms and the last three atoms, a torsion around the bond between the middle two atoms. periodic : bool, default=True If `periodic` is True and the trajectory contains unitcell information, we will treat dihedrals that cross periodic images using the minimum image convention. opt : bool, default=True Use an optimized native library to calculate angles. Returns ------- dihedrals : np.ndarray, shape=(n_frames, n_dihedrals), dtype=float The output array gives, in each frame from the trajectory, each of the `n_dihedrals` torsion angles. The angles are measured in **radians**. """ xyz = ensure_type(traj.xyz, dtype=np.float32, ndim=3, name='traj.xyz', shape=(None, None, 3), warn_on_cast=False) quartets = ensure_type(np.asarray(indices), dtype=np.int32, ndim=2, name='indices', shape=(None, 4), warn_on_cast=False) if not np.all(np.logical_and(quartets < traj.n_atoms, quartets >= 0)): raise ValueError('indices must be between 0 and %d' % traj.n_atoms) out = np.zeros((xyz.shape[0], quartets.shape[0]), dtype=np.float32) if periodic is True and traj._have_unitcell: box = ensure_type(traj.unitcell_vectors, dtype=np.float32, ndim=3, name='unitcell_vectors', shape=(len(xyz), 3, 3)) if opt and _geometry._processor_supports_sse41(): _geometry._dihedral_mic(xyz, quartets, box, out) return out else: _dihedral(traj, quartets, periodic, out) return out if opt and _geometry._processor_supports_sse41(): _geometry._dihedral(xyz, quartets, out) else: _dihedral(traj, quartets, periodic, out) return out
def compute_dihedrals(traj, indices, periodic=True, opt=True): """Compute the dihedral angles between the supplied quartets of atoms in each frame in a trajectory. Parameters ---------- traj : Trajectory An mtraj trajectory. indices : np.ndarray, shape=(n_dihedrals, 4), dtype=int Each row gives the indices of four atoms which together make a dihedral angle. The angle is between the planes spanned by the first three atoms and the last three atoms, a torsion around the bond between the middle two atoms. periodic : bool, default=True If `periodic` is True and the trajectory contains unitcell information, we will treat dihedrals that cross periodic images using the minimum image convention. opt : bool, default=True Use an optimized native library to calculate angles. Returns ------- dihedrals : np.ndarray, shape=(n_frames, n_dihedrals), dtype=float The output array gives, in each frame from the trajectory, each of the `n_dihedrals` torsion angles. The angles are measured in **radians**. """ xyz = ensure_type(traj.xyz, dtype=np.float32, ndim=3, name='traj.xyz', shape=(None, None, 3), warn_on_cast=False) quartets = ensure_type(indices, dtype=np.int32, ndim=2, name='indices', shape=(None, 4), warn_on_cast=False) if not np.all(np.logical_and(quartets < traj.n_atoms, quartets >= 0)): raise ValueError('indices must be between 0 and %d' % traj.n_atoms) if len(quartets) == 0: return np.zeros((len(xyz), 0), dtype=np.float32) if periodic and traj._have_unitcell: if opt and not np.allclose(traj.unitcell_angles, 90): warnings.warn('Optimized dihedral calculation does not work for non-orthorhombic ' 'unit cells and periodic boundary conditions. Falling back to much ' 'slower pure-Python implementation. Set periodic=False or opt=False ' 'to disable this message.') opt = False out = np.zeros((xyz.shape[0], quartets.shape[0]), dtype=np.float32) if periodic and traj._have_unitcell: box = ensure_type(traj.unitcell_vectors, dtype=np.float32, ndim=3, name='unitcell_vectors', shape=(len(xyz), 3, 3)) if opt: _geometry._dihedral_mic(xyz, quartets, box, out) return out else: _dihedral(traj, quartets, periodic, out) return out if opt: _geometry._dihedral(xyz, quartets, out) else: _dihedral(traj, quartets, periodic, out) return out