Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
# along the positive z-axis.
guest_angle_restraint_mask = self.guest_yaml["restraints"]["guest"][-1]["restraint"][
"atoms"
].split()
aligned_structure = align.zalign(
structure, guest_angle_restraint_mask[1], guest_angle_restraint_mask[2]
)
aligned_structure.save(str(intermediate_pdb), overwrite=True)
else:
# Create a PDB file just for the host.
host = pmd.load_file(str(input_pdb), structure=True)
host_coordinates = host[f":{self.host_yaml['resname'].upper()}"].coordinates
# Cheap way to get the center of geometry
offset_coordinates = pmd.geometry.center_of_mass(host_coordinates,
masses=np.ones(len(host_coordinates)))
# Find the principal components, take the two largest, and find the vector orthogonal to that
# (should be cross-product right hand rule, I think). Use that vector to align with the z-axis.
# This may not generalize to non-radially-symmetric host molecules.
aligned_coords = np.empty_like(structure.coordinates)
for atom in range(len(structure.atoms)):
aligned_coords[atom] = structure.coordinates[atom] - offset_coordinates
structure.coordinates = aligned_coords
inertia_tensor = np.dot(structure.coordinates.transpose(), structure.coordinates)
eigenvalues, eigenvectors = np.linalg.eig(inertia_tensor)
order = np.argsort(eigenvalues)
axis_3, axis_2, axis_1 = eigenvectors[:, order].transpose()
"""Returns the calculated center of mass of the ligand as a numpy.array
Parameters
----------
positions: nx3 numpy array * simtk.unit compatible with simtk.unit.nanometers
ParmEd positions of the atoms to be moved.
masses : numpy.array
numpy.array of particle masses
Returns
-------
center_of_mass: numpy array * simtk.unit compatible with simtk.unit.nanometers
1x3 numpy.array of the center of mass of the given positions
"""
coordinates = numpy.asarray(positions._value, numpy.float32)
center_of_mass = parmed.geometry.center_of_mass(coordinates, masses) * positions.unit
return center_of_mass
Returns
-------
parmed.Structure
A molecular structure with the coordinates aligned as specified.
"""
mask1_coordinates = structure[mask1].coordinates
mask1_masses = [atom.mass for atom in structure[mask1].atoms]
mask1_com = pmd.geometry.center_of_mass(
np.asarray(mask1_coordinates), np.asarray(mask1_masses)
)
mask2_coordinates = structure[mask2].coordinates
mask2_masses = [atom.mass for atom in structure[mask2].atoms]
mask2_com = pmd.geometry.center_of_mass(
np.asarray(mask2_coordinates), np.asarray(mask2_masses)
)
logger.info(
"Moving {} ({} atoms) to the origin...".format(mask1, len(mask1_coordinates))
)
logger.info(
"Aligning {} ({} atoms) with the z axis...".format(
mask2, len(mask2_coordinates)
)
)
axis = np.array([0.0, 0.0, 1.0])
identity = np.identity(3)
# https://math.stackexchange.com/questions/293116/rotating-one-3d-vector-to-another
"""Returns the calculated center of mass of the ligand as a np.array
Parameters
----------
positions: nx3 numpy array * simtk.unit compatible with simtk.unit.nanometers
ParmEd positions of the atoms to be moved.
masses : numpy.array
np.array of particle masses
Returns
-------
center_of_mass: numpy array * simtk.unit compatible with simtk.unit.nanometers
1x3 np.array of the center of mass of the given positions
"""
coordinates = np.asarray(positions._value, np.float32)
center_of_mass = parmed.geometry.center_of_mass(coordinates, masses) * positions.unit
return center_of_mass
def getCenterOfMass(self, positions, masses):
"""Returns the calculated center of mass of the ligand as a np.array
Parameters
----------
structure: parmed.Structure
ParmEd Structure object of the model to be moved.
masses : numpy.array
np.array of particle masses
"""
coordinates = np.asarray(positions._value, np.float32)
center_of_mass = parmed.geometry.center_of_mass(coordinates, masses) * positions.unit
return center_of_mass
mask2 : str
Selection of second set of atoms
save : bool, optional
Whether to save the coordinates (the default is False, which does nothing)
filename : str, optional
The filename for the saved coordinates (the default is None, which does nothing)
Returns
-------
parmed.Structure
A molecular structure with the coordinates aligned as specified.
"""
mask1_coordinates = structure[mask1].coordinates
mask1_masses = [atom.mass for atom in structure[mask1].atoms]
mask1_com = pmd.geometry.center_of_mass(
np.asarray(mask1_coordinates), np.asarray(mask1_masses)
)
mask2_coordinates = structure[mask2].coordinates
mask2_masses = [atom.mass for atom in structure[mask2].atoms]
mask2_com = pmd.geometry.center_of_mass(
np.asarray(mask2_coordinates), np.asarray(mask2_masses)
)
logger.info(
"Moving {} ({} atoms) to the origin...".format(mask1, len(mask1_coordinates))
)
logger.info(
"Aligning {} ({} atoms) with the z axis...".format(
mask2, len(mask2_coordinates)
)
positions: nx3 numpy array * simtk.unit compatible with simtk.unit.nanometers
ParmEd positions of the atoms to be moved.
masses : numpy.array
numpy.array of particle masses
Returns
-------
center_of_mass: numpy array * simtk.unit compatible with simtk.unit.nanometers
1x3 numpy.array of the center of mass of the given positions
"""
if isinstance(positions, unit.Quantity):
coordinates = np.asarray(positions._value, np.float32)
pos_unit = positions.unit
else:
coordinates = np.asarray(positions, np.float32)
pos_unit = unit.angstroms
center_of_mass = parmed.geometry.center_of_mass(coordinates, masses) * pos_unit
return center_of_mass