MembraneCurvature calculates mean and Gaussian curvature of surfaces derived from atoms of reference in 4 steps:

1. Select atoms of reference

2. Set grid

3. Derive surface and calculate curvature

4. Average over frames

A summary of the algorithm used in MembraneCurvature is shown in the following diagram:


1. Select atoms of reference

The first step in the algorithm consists of selecting atoms that will be used as a reference to derive a surface. This selection will be contained in an AtomGroup. Typically in biological membranes, lipid headgroups are the most common elements to use as an AtomGroup of reference.


2. Set grid

The dimensions of the grid are determined by the size of the simulation box contained in the Universe. The grid comprises n_x_bins x n_y_bins number of bins.


For every atom in the AtomGroup of reference, MembraneCurvature assigns an index in the grid, according to their respective x and y coordinates. i.e. (x, y) [l, m].


Unless the user provides a different input, MembraneCurvature will determine the dimensions of the grid based on the size of the box on the first frame via dimensions.

grid_dimension_x = (0, universe.dimensions[0])
grid_dimension_y = (0, universe.dimensions[1])

Once the grid is populated according to the coordinates of the atoms in the AtomGroup of reference, the associated z coordinate of each atom in the AtomGroup is stored in an array assigned to each [l, m] index.

3. Derive surface and calculate curvature

Once the surface formed by the atoms of reference is derived, values of mean (H) and Gaussian (K) curvature are calculated according to their respective equations.

For every frame of the trajectory, the surface derived from the AtomGroup is calculated and stored in z_surface. Similarly, the calculation of mean and Gaussian curvature is performed in every frame and stored in MembraneCurvature.results.mean_curvature and MembraneCurvature.results.gaussian_curvature, respectively.


4. Average over frames

The attributes MembraneCurvature.results.average_mean and MembraneCurvature.results.average_gaussian contain the computed values of mean and Gaussian curvature averaged over all the n_frames in the trajectory.

After performing the average over frames, the information of average surface, mean, and Gaussian curvature are stored in the MembraneCurvature.results.average_z_surface, MembraneCurvature.results.average_mean, and MembraneCurvature.results.average_gaussian arrays, respectively. Each array has shape (n_x_bins, n_y_bins).