Springcraft - Investigate molecular dynamics by elastic network models¶
Springcraft is a Biotite extension package, that allows the analysis of AtomArray objects via Elastic Network Models (ENMs). An ENM can be thought of as a system that connects residues via springs: Interaction of nearby residues is governed by a harmonic potential, with the native (input) conformation representing the energy minimum. Normal mode analysis allows the researcher to investigate global functional movements of a protein in a fast coarse-grained manner. For a deeper dive into the theory of ENMs please refer to literature, such as a method review from 2010.
Springcraft can be installed via
$ pip install springcraft
$ conda install -c conda-forge springcraft
You can also install Springcraft from source on GitHub. The package uses Poetry for building distributions. Via PEP 517 it is possible to install the package from local source code via pip:
$ git clone https://github.com/biotite-dev/springcraft.git $ pip install ./springcraft
To compute an ENM a
ForceField is required, that defines the spring
force constant for each pair of atoms via
A variety of
ForceField subclasses is available, each bringing
its own concept for parameterization.
import biotite.structure.io as strucio import springcraft # All pairs of atoms within a cutoff distance obtain the same force constant ff = springcraft.InvariantForceField(cutoff_distance=13.0) # The force constant is inversely proportional to the squared distance ff = springcraft.ParameterFreeForceField() # The force constant is read from tabulated values # based on residue types and distance # For the residue type the underlying CA-trace is required atoms = strucio.load_structure("path/to/structure.pdb") atoms = atoms[(atoms.atom_name == "CA") & (atoms.element == "C")] ff = springcraft.TabulatedForceField.sd_enm(atoms)
atom coordinates at the presumed minimum energy conformation, which is usually
simply the experimentally determined conformation, and the
to compute the Kirchhoff and Hessian matrix of the molecular system,
As byproduct it also returns the pairs of atoms that were found within
cutoff distance given by the
ff = springcraft.InvariantForceField(cutoff_distance=13.0) hessian, pairs = springcraft.compute_hessian(atoms.coord, ff)
One type of ENMs are Gaussian Network models (GNM).
They do not include directional information, but can be used to
investigate whether atoms move collectively and which atoms are involved
in global movements.
GNM is created using an
AtomArray representing the
structure model and a
Internally, both are given to
compute_kirchhoff() to obtain the
Kirchhoff matrix, which can be accessed with the kirchhoff attribute.
GNM is only a thin wrapper around
compute_kirchhoff(), that conveniently provides common operations
performed on the Kirchhoff matrix.
This includes the calculation of eigenvectors and eigenvalues among other
A useful quantity is the correlation between the displacements of two atoms.
This value is contained in the covariance matrix (the covariance attribute),
which is the pseudo-inverse of the Kirchhoff matrix.
Note that Springcraft uses arbitrary units, i.e. factors like the Boltzmann constant or the temperature are generally not applied, if not stated otherwise.
The kirchhoff and covariance matrix can also be modified to alter the network model. Changing one attribute also updates the other attribute.
gnm = springcraft.GNM(atoms, ff) eigen_values, eigen_vectors = gnm.eigen()
GNM, the class for Anisotropic Network models
ANM is a wrapper around the Hessian matrix, which in contrast to the
Kirchhoff matrix also includes the directionality of oscillation modes.
Hence, its shape is \(3n \times 3n\) since it comprises the three
spatial dimensions for each atom \((x_1, y_1, z_1, x_2, ...)\).
GNM, the Hessian as well as its pseudo-inverse, the
covariance matrix, are accessible via the hessian and covariance
The added spatial information allows an
ANM the depiction of
atom oscillations in normal modes or the application of
Linear Response Theory to investigate conformational changes upon ligand
import numpy as np anm = springcraft.ANM(atoms, ff) force_vector = np.zeros((atoms.array_length(), 3)) force_vector[42, 0] = 10 displacements = anm.linear_response(force_vector)