Coordinates and Other Geometric Manipulations

Coordinates of Molecule objects are easy to manipulate

[2]:
# Imports molli
import molli as ml

# Loads dendrobine to the s1 variable
mol = ml.load(ml.files.dendrobine_mol2)

Vectors, Angles and Dihedrals are also available

[3]:
#Gets an Example Atom 1 and 2
ex_atom1, ex_atom2 = mol.get_atoms(0,1)

#Finds vector between Example Atom 1 and 2
v1 = mol.vector(ex_atom1, ex_atom2)
print(f'Vector between Example Atom 1 and 2: {v1}')

#Finds Angle between atoms 1, 2, and 3
angle1 = mol.angle(0, 1, 2)
print(f'Angle between Example Atom 1, 2, and 3: {angle1}')

#Finds Dihedral Angle between atoms 1, 2, 3, and 4
angle2 = mol.dihedral(0,1,2,3)
print(f'Angle between Example Atom 1, 2, and 3: {angle2}')
Vector between Example Atom 1 and 2: [-1.2387  0.2093  0.8557]
Angle between Example Atom 1, 2, and 3: 1.8082869758837117
Angle between Example Atom 1, 2, and 3: -0.3286236550063439

It’s very simple to translate individual atoms to set the origin of a molecule via translation

[4]:

#This gets the indeex of an atom ex_atom1_idx = mol.get_atom_index(ex_atom1) ml.CartesianGeometry #This places that atom at the origin mol.translate(-1*mol.coords[ex_atom1_idx]) mol.coords
[4]:
array([[ 0.0000e+00,  0.0000e+00,  0.0000e+00],
       [-1.2387e+00,  2.0930e-01,  8.5570e-01],
       [-2.3934e+00, -2.4190e-01, -6.1100e-02],
       [-1.7244e+00, -1.7940e-01, -1.4357e+00],
       [-4.2770e-01,  5.9170e-01, -1.2674e+00],
       [ 1.1602e+00,  6.7360e-01,  5.6910e-01],
       [-3.7288e+00,  4.9780e-01, -2.8380e-01],
       [-3.9513e+00,  4.7910e-01, -1.8471e+00],
       [-2.5388e+00,  7.9450e-01, -2.2833e+00],
       [ 2.3930e-01,  8.1090e-01, -2.6849e+00],
       [ 4.5000e-02,  2.2682e+00, -2.9177e+00],
       [-1.2178e+00,  2.4610e+00, -3.4836e+00],
       [-1.8937e+00,  1.0858e+00, -3.6690e+00],
       [-1.7095e+00,  3.5499e+00, -3.7222e+00],
       [-5.3580e-01,  3.9970e-01, -3.9671e+00],
       [-5.1480e-01, -9.8220e-01, -4.6443e+00],
       [-5.3400e-02,  1.0003e+00, -4.7652e+00],
       [-2.4754e+00,  1.7899e+00, -1.8047e+00],
       [-6.4440e-01,  1.6271e+00, -9.4960e-01],
       [-2.6682e+00, -1.2591e+00,  2.4640e-01],
       [-1.5788e+00, -1.6516e+00, -1.8627e+00],
       [ 8.8150e-01, -1.6093e+00, -4.5885e+00],
       [-9.4750e-01, -8.6870e-01, -6.1184e+00],
       [-1.2370e+00, -1.6690e+00, -4.2148e+00],
       [-1.3609e+00,  1.2583e+00,  1.1528e+00],
       [-1.1798e+00, -4.0890e-01,  1.7574e+00],
       [ 1.4190e+00,  2.2700e-01,  1.5349e+00],
       [ 9.9670e-01,  1.7466e+00,  7.2040e-01],
       [ 2.0295e+00,  5.4810e-01, -8.5200e-02],
       [-3.6676e+00,  1.5281e+00,  8.6400e-02],
       [-4.5599e+00,  5.8000e-03,  2.3120e-01],
       [-4.6770e+00,  1.2388e+00, -2.1506e+00],
       [-4.2894e+00, -5.0390e-01, -2.1892e+00],
       [ 1.3128e+00,  6.1170e-01, -2.7064e+00],
       [-2.5889e+00,  1.1091e+00, -4.5093e+00],
       [-1.6035e+00, -2.3535e+00, -1.0195e+00],
       [-6.0400e-01, -1.8571e+00, -2.2989e+00],
       [-2.3903e+00, -1.9585e+00, -2.5284e+00],
       [ 8.8350e-01, -2.5922e+00, -5.0719e+00],
       [ 1.2216e+00, -1.7503e+00, -3.5584e+00],
       [ 1.6183e+00, -9.8160e-01, -5.1013e+00],
       [-9.4380e-01, -1.8540e+00, -6.5977e+00],
       [-2.7280e-01, -2.2010e-01, -6.6880e+00],
       [-1.9612e+00, -4.6480e-01, -6.2016e+00]])

molli also has the ability to rotate Molecule objects based on a pre-defined transformation matrix

[5]:
#Imports a the rotation matrix creation function
from molli.math import rotation_matrix_from_vectors

#This finds the vector between atom1 and atom2
v1 = mol.vector(ex_atom1, ex_atom2)

#This defines a transformation matrix to rotate v1 onto the z axis
t_matrix = rotation_matrix_from_vectors(v1, [0,0,1])

#This transforms the molecule to be on the z axis
mol.transform(t_matrix)

mol.coords
[5]:
array([[ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00],
       [-6.55267747e-17, -2.55707541e-17,  1.52000219e+00],
       [-1.44358231e+00, -4.02388288e-01,  1.88275494e+00],
       [-2.17456623e+00, -1.03336554e-01,  5.72326391e-01],
       [-1.23633091e+00,  7.28332315e-01, -2.83472867e-01],
       [ 1.17936048e+00,  6.70362502e-01, -5.32352120e-01],
       [-2.33993688e+00,  2.63127318e-01,  2.94749998e+00],
       [-3.74322199e+00,  4.43941586e-01,  2.24617272e+00],
       [-3.26373552e+00,  9.16990518e-01,  8.92946474e-01],
       [-1.99217523e+00,  1.18794671e+00, -1.59484538e+00],
       [-2.18900375e+00,  2.64567395e+00, -1.36689482e+00],
       [-3.36255687e+00,  2.82339413e+00, -6.29828275e-01],
       [-4.00108299e+00,  1.44187916e+00, -3.72748916e-01],
       [-3.76159361e+00,  3.89663706e+00, -2.13509442e-01],
       [-3.51235774e+00,  9.02641418e-01, -1.74163880e+00],
       [-4.15136812e+00, -3.67738299e-01, -2.33027243e+00],
       [-3.84221139e+00,  1.64048586e+00, -2.50135972e+00],
       [-2.76578225e+00,  1.83896515e+00,  1.24777600e+00],
       [-1.02762999e+00,  1.69185340e+00,  2.14603368e-01],
       [-1.42405608e+00, -1.46931985e+00,  2.13974309e+00],
       [-2.54450720e+00, -1.48842690e+00,  1.05705703e-02],
       [-3.34791864e+00, -8.94665851e-01, -3.52310017e+00],
       [-5.59335390e+00, -8.37018388e-02, -2.79188119e+00],
       [-4.26599438e+00, -1.15719850e+00, -1.59450701e+00],
       [ 2.47154314e-01,  9.86591138e-01,  1.93128667e+00],
       [ 7.24313794e-01, -7.30633283e-01,  1.89449902e+00],
       [ 2.08319231e+00,  1.14773108e-01, -2.61045853e-01],
       [ 1.28566941e+00,  1.69777357e+00, -1.66185701e-01],
       [ 1.13706592e+00,  6.98892325e-01, -1.62639894e+00],
       [-1.92908187e+00,  1.23434700e+00,  3.24790316e+00],
       [-2.43352793e+00, -3.53487700e-01,  3.84696807e+00],
       [-4.35335433e+00,  1.18411441e+00,  2.77131989e+00],
       [-4.28702409e+00, -5.04301451e-01,  2.19375675e+00],
       [-1.40663797e+00,  1.07119654e+00, -2.50920890e+00],
       [-5.08400155e+00,  1.53069099e+00, -2.76054174e-01],
       [-1.92195390e+00, -2.29969165e+00,  4.08737403e-01],
       [-2.35413645e+00, -1.56138388e+00, -1.05768595e+00],
       [-3.57572850e+00, -1.75820115e+00,  2.54867185e-01],
       [-3.81127519e+00, -1.79893573e+00, -3.93220731e+00],
       [-2.32299092e+00, -1.15137945e+00, -3.23976940e+00],
       [-3.29702311e+00, -1.51070311e-01, -4.32579606e+00],
       [-6.05256389e+00, -9.90785111e-01, -3.20039606e+00],
       [-5.62295918e+00,  6.83902839e-01, -3.57306798e+00],
       [-6.21512762e+00,  2.53975370e-01, -1.95700594e+00]])

Centroids are also available, along with distances to arbitrary points

[6]:
#This gives the array representing the molecule's centroid
cent = mol.centroid()

#This gives the distance of Atom 1 to the centroid
dist_to_cent = mol.distance_to_point(ex_atom1, cent)

print(f'Here is the centroid\n{cent}\n')
print(f'Here is the distance to the centroid from Atom 1: {dist_to_cent}')
Here is the centroid
[-2.49985446  0.30186006 -0.34948863]

Here is the distance to the centroid from Atom 1: 2.5421514741871256