Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
This code uses the golden section spiral algorithm
(picture at http://xsisupport.com/2012/02/25/evenly-distributing-points-on-a-sphere-with-the-golden-sectionspiral/)
where you make this spiral that traces out the unit sphere and then put points
down equidistant along the spiral. It's cheap, but not perfect.
The gromacs utility g_sas uses a slightly different algorithm for generating
points on the sphere, which is based on an icosahedral tesselation.
roughly, the icosahedral tesselation works something like this
http://www.ziyan.info/2008/11/sphere-tessellation-using-icosahedron.html
References
----------
.. [1] Shrake, A; Rupley, JA. (1973) J Mol Biol 79 (2): 351--71.
"""
xyz = ensure_type(traj.xyz, dtype=np.float32, ndim=3, name='traj.xyz', shape=(None, None, 3), warn_on_cast=False)
if mode == 'atom':
dim1 = xyz.shape[1]
atom_mapping = np.arange(dim1, dtype=np.int32)
elif mode == 'residue':
dim1 = traj.n_residues
atom_mapping = np.array(
[a.residue.index for a in traj.top.atoms], dtype=np.int32)
if not np.all(np.unique(atom_mapping) ==
np.arange(1 + np.max(atom_mapping))):
raise ValueError('residues must have contiguous integer indices '
'starting from zero')
else:
raise ValueError('mode must be one of "residue", "atom". "%s" supplied' %
mode)
modified_radii = {}
over 1000x faster than the naive numpy implementation.
Returns
-------
displacements : np.ndarray, shape=[n_frames, n_pairs, 3], dtype=float32
The displacememt vector, in each frame, between each pair of atoms.
"""
xyz = ensure_type(traj.xyz, dtype=np.float32, ndim=3, name='traj.xyz', shape=(None, None, 3), warn_on_cast=False)
pairs = ensure_type(np.asarray(atom_pairs), dtype=np.int32, ndim=2, name='atom_pairs', shape=(None, 2), warn_on_cast=False)
if not np.all(np.logical_and(pairs < traj.n_atoms, pairs >= 0)):
raise ValueError('atom_pairs must be between 0 and %d' % traj.n_atoms)
if len(pairs) == 0: # If pairs is an empty slice of an array
return np.zeros((len(xyz), 0, 3), 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),
warn_on_cast=False)
orthogonal = np.allclose(traj.unitcell_angles, 90)
if opt:
out = np.empty((xyz.shape[0], pairs.shape[0], 3), dtype=np.float32)
_geometry._dist_mic_displacement(xyz, pairs, box.transpose(0, 2, 1).copy(), out, orthogonal)
return out
else:
return _displacement_mic(xyz, pairs, box.transpose(0, 2, 1), orthogonal)
# either there are no unitcell vectors or they dont want to use them
if opt:
out = np.empty((xyz.shape[0], pairs.shape[0], 3), dtype=np.float32)
_geometry._dist_displacement(xyz, pairs, out)
return out
return _displacement(xyz, pairs)
if n_frames is None:
n_frames = np.inf
if stride is not None:
stride = int(stride)
total_n_frames = len(self._handle.root.coordinates)
frame_slice = slice(self._frame_index, min(self._frame_index + n_frames, total_n_frames), stride)
if frame_slice.stop - frame_slice.start == 0:
return []
if atom_indices is None:
# get all of the atoms
atom_slice = slice(None)
else:
atom_slice = ensure_type(atom_indices, dtype=np.int, ndim=1,
name='atom_indices', warn_on_cast=False)
if not np.all(atom_slice < self._handle.root.coordinates.shape[1]):
raise ValueError('As a zero-based index, the entries in '
'atom_indices must all be less than the number of atoms '
'in the trajectory, %d' % self._handle.root.coordinates.shape[1])
if not np.all(atom_slice >= 0):
raise ValueError('The entries in atom_indices must be greater '
'than or equal to zero')
def get_field(name, slice, out_units, can_be_none=True):
try:
node = self._get_node(where='/', name=name)
data = node.__getitem__(slice)
in_units = node.attrs.units
if not isinstance(in_units, string_types):
in_units = in_units.decode()
The indices of atoms in the first group.
group2 : np.ndarray, shape=(num_atoms), dtype=int
The indices of atoms in the second group.
frame : int, default=0
The frame of the Trajectory to take positions from
periodic : bool, default=True
If `periodic` is True and the trajectory contains unitcell
information, we will compute distances under the minimum image
convention.
Returns
-------
result : tuple (int, int, float)
The indices of the two atoms forming the closest contact, and the distance between them.
"""
xyz = ensure_type(traj.xyz, dtype=np.float32, ndim=3, name='traj.xyz', shape=(None, None, 3), warn_on_cast=False)[frame]
atoms1 = ensure_type(group1, dtype=np.int32, ndim=1, name='group1', warn_on_cast=False)
atoms2 = ensure_type(group2, dtype=np.int32, ndim=1, name='group2', warn_on_cast=False)
if periodic and traj._have_unitcell:
box = ensure_type(traj.unitcell_vectors, dtype=np.float32, ndim=3, name='unitcell_vectors', shape=(len(traj.xyz), 3, 3),
warn_on_cast=False)[frame]
else:
box = None
return _geometry._find_closest_contact(xyz, atoms1, atoms2, box)
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)
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:
orthogonal = np.allclose(traj.unitcell_angles, 90)
_geometry._dihedral_mic(xyz, quartets, box.transpose(0, 2, 1).copy(), out, orthogonal)
return out
else:
_dihedral(traj, quartets, periodic, out)
return out
def _mix_all_replicas_cython(self):
"""Exchange all replicas with Cython-accelerated code."""
from openmmtools.multistate.mixing._mix_replicas import _mix_replicas_cython
replica_states = md.utils.ensure_type(self._replica_thermodynamic_states, np.int64, 1, "Replica States")
u_kl = md.utils.ensure_type(self._energy_thermodynamic_states, np.float64, 2, "Reduced Potentials")
n_proposed_matrix = md.utils.ensure_type(self._n_proposed_matrix, np.int64, 2, "Nij Proposed Swaps")
n_accepted_matrix = md.utils.ensure_type(self._n_accepted_matrix, np.int64, 2, "Nij Accepted Swaps")
_mix_replicas_cython(self.n_replicas**4, self.n_replicas, replica_states,
u_kl, n_proposed_matrix, n_accepted_matrix)
self._replica_thermodynamic_states = replica_states
self._n_proposed_matrix = n_proposed_matrix
self._n_accepted_matrix = n_accepted_matrix
def _center(conformation):
"""Center the conformation"""
ensure_type(conformation, 'float', 2, 'conformation', warn_on_cast=False, shape=(None, 3))
centroid = np.mean(conformation, axis=0)
centered = conformation - centroid
return centered
ndim=2,
name='cell_lengths',
shape=(n_frames, 3),
can_be_none=True,
warn_on_cast=False,
add_newaxis_on_deficient_ndim=True)
cell_angles = ensure_type(
cell_angles,
dtype=np.float32,
ndim=2,
name='cell_angles',
shape=(n_frames, 3),
can_be_none=True,
warn_on_cast=False,
add_newaxis_on_deficient_ndim=True)
velocities = ensure_type(
velocities,
dtype=np.float32,
ndim=3,
name='velocoties',
shape=(n_frames, n_atoms, 3),
can_be_none=True,
warn_on_cast=False,
add_newaxis_on_deficient_ndim=True)
kineticEnergy = ensure_type(
kineticEnergy,
dtype=np.float32,
ndim=1,
name='kineticEnergy',
shape=(n_frames,),
can_be_none=True,
warn_on_cast=False,
def _mix_all_replicas_cython(self):
"""Exchange all replicas with Cython-accelerated code."""
from openmmtools.multistate.mixing._mix_replicas import _mix_replicas_cython
replica_states = md.utils.ensure_type(self._replica_thermodynamic_states, np.int64, 1, "Replica States")
u_kl = md.utils.ensure_type(self._energy_thermodynamic_states, np.float64, 2, "Reduced Potentials")
n_proposed_matrix = md.utils.ensure_type(self._n_proposed_matrix, np.int64, 2, "Nij Proposed Swaps")
n_accepted_matrix = md.utils.ensure_type(self._n_accepted_matrix, np.int64, 2, "Nij Accepted Swaps")
_mix_replicas_cython(self.n_replicas**4, self.n_replicas, replica_states,
u_kl, n_proposed_matrix, n_accepted_matrix)
self._replica_thermodynamic_states = replica_states
self._n_proposed_matrix = n_proposed_matrix
self._n_accepted_matrix = n_accepted_matrix