{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Writing your own trajectory analysis\n",
"\n",
"We create our own analysis methods for calculating the radius of gyration of a selection of atoms.\n",
"\n",
"This can be done three ways, from least to most flexible:\n",
"\n",
" 1. [Running the analysis directly from a function](#Creating-an-analysis-from-a-function)\n",
" \n",
" 2. [Turning a function into a class](#Transforming-a-function-into-a-class)\n",
" \n",
" 3. [Writing your own class](#Creating-your-own-class)\n",
"\n",
"The building blocks and methods shown here are only suitable for analyses that involve iterating over the trajectory once.\n",
"\n",
"If you implement your own analysis method, please consider [contributing it to the MDAnalysis codebase!](https://www.mdanalysis.org/UserGuide/contributing.html)\n",
"\n",
"**Last executed:** May 18, 2021 with MDAnalysis 1.1.1\n",
"\n",
"**Last updated:** February 2020\n",
"\n",
"**Minimum version of MDAnalysis:** 0.19.0\n",
"\n",
"**Packages required:**\n",
" \n",
"* MDAnalysis (Michaud-Agrawal *et al.*, 2011, Gowers *et al.*, 2016)\n",
"* MDAnalysisTests\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"execution": {
"iopub.execute_input": "2021-05-19T05:45:44.674135Z",
"iopub.status.busy": "2021-05-19T05:45:44.673007Z",
"iopub.status.idle": "2021-05-19T05:45:46.290616Z",
"shell.execute_reply": "2021-05-19T05:45:46.291341Z"
}
},
"outputs": [],
"source": [
"import MDAnalysis as mda\n",
"from MDAnalysis.tests.datafiles import PSF, DCD, DCD2\n",
"from MDAnalysis.analysis.base import (AnalysisBase,\n",
" AnalysisFromFunction,\n",
" analysis_class)\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Radius of gyration\n",
"\n",
"Let's start off by defining a standalone analysis function.\n",
"\n",
"The radius of gyration of a structure measures how compact it is. In [GROMACS](http://manual.gromacs.org/documentation/2019-rc1/reference-manual/analysis/radius-of-gyration.html), it is calculated as follows: \n",
"\n",
"$$ R_g = \\sqrt{\\frac{\\sum_i m_i \\mathbf{r}_i^2}{\\sum_i m_i}}$$\n",
"\n",
"where $m_i$ is the mass of atom $i$ and $\\mathbf{r}_i$ is the position of atom $i$, relative to the center-of-mass of the selection.\n",
"\n",
"The radius of gyration around each axis can also be determined separately. For example, the radius of gyration around the x-axis:\n",
"\n",
"$$ R_{i, x} = \\sqrt{\\frac{\\sum_i m_i [r_{i, y}^2 + r_{i, z}^2]}{\\sum_i m_i}}$$\n",
"\n",
"Below, we define a function that takes an AtomGroup and calculates the radii of gyration. We could write this function to only need the AtomGroup. However, we also add in a `masses` argument and a `total_mass` keyword to avoid recomputing the mass and total mass for each frame."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"execution": {
"iopub.execute_input": "2021-05-19T05:45:46.297926Z",
"iopub.status.busy": "2021-05-19T05:45:46.297404Z",
"iopub.status.idle": "2021-05-19T05:45:46.299247Z",
"shell.execute_reply": "2021-05-19T05:45:46.299751Z"
}
},
"outputs": [],
"source": [
"def radgyr(atomgroup, masses, total_mass=None):\n",
" # coordinates change for each frame\n",
" coordinates = atomgroup.positions\n",
" center_of_mass = atomgroup.center_of_mass()\n",
" \n",
" # get squared distance from center\n",
" ri_sq = (coordinates-center_of_mass)**2\n",
" # sum the unweighted positions\n",
" sq = np.sum(ri_sq, axis=1)\n",
" sq_x = np.sum(ri_sq[:,[1,2]], axis=1) # sum over y and z\n",
" sq_y = np.sum(ri_sq[:,[0,2]], axis=1) # sum over x and z\n",
" sq_z = np.sum(ri_sq[:,[0,1]], axis=1) # sum over x and y\n",
" \n",
" # make into array\n",
" sq_rs = np.array([sq, sq_x, sq_y, sq_z])\n",
" \n",
" # weight positions\n",
" rog_sq = np.sum(masses*sq_rs, axis=1)/total_mass\n",
" # square root and return\n",
" return np.sqrt(rog_sq)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Loading files\n",
"\n",
"The test files we will be working with here feature adenylate kinase (AdK), a phosophotransferase enzyme. (Beckstein *et al.*, 2009)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"execution": {
"iopub.execute_input": "2021-05-19T05:45:46.304382Z",
"iopub.status.busy": "2021-05-19T05:45:46.303729Z",
"iopub.status.idle": "2021-05-19T05:45:46.735057Z",
"shell.execute_reply": "2021-05-19T05:45:46.736379Z"
}
},
"outputs": [],
"source": [
"u = mda.Universe(PSF, DCD)\n",
"protein = u.select_atoms('protein')\n",
"\n",
"u2 = mda.Universe(PSF, DCD2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Creating an analysis from a function\n",
"\n",
"`MDAnalysis.analysis.base.AnalysisFromFunction` can create an analysis from a function that works on AtomGroups. It requires the function itself, the trajectory to operate on, and then the arguments / keyword arguments necessary for the function."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"execution": {
"iopub.execute_input": "2021-05-19T05:45:46.744071Z",
"iopub.status.busy": "2021-05-19T05:45:46.743156Z",
"iopub.status.idle": "2021-05-19T05:45:46.820924Z",
"shell.execute_reply": "2021-05-19T05:45:46.821283Z"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/lily/anaconda3/envs/mda-user-guide/lib/python3.7/site-packages/MDAnalysis/analysis/base.py:282: DeprecationWarning: The structure of the `results` array will change in MDAnalysis version 2.0.\n",
" \"MDAnalysis version 2.0.\", category=DeprecationWarning\n"
]
},
{
"data": {
"text/plain": [
""
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rog = AnalysisFromFunction(radgyr, u.trajectory, \n",
" protein, protein.masses, \n",
" total_mass=np.sum(protein.masses))\n",
"rog.run();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Running the analysis iterates over the trajectory. The output is saved in `rog.results`, which has the same number of rows, as frames in the trajectory."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"execution": {
"iopub.execute_input": "2021-05-19T05:45:46.827199Z",
"iopub.status.busy": "2021-05-19T05:45:46.826150Z",
"iopub.status.idle": "2021-05-19T05:45:46.829723Z",
"shell.execute_reply": "2021-05-19T05:45:46.830409Z"
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"(98, 4)"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rog.results.shape"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"execution": {
"iopub.execute_input": "2021-05-19T05:45:46.853297Z",
"iopub.status.busy": "2021-05-19T05:45:46.851794Z",
"iopub.status.idle": "2021-05-19T05:45:46.991491Z",
"shell.execute_reply": "2021-05-19T05:45:46.991906Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 0, 'Frame')"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"labels = ['all', 'x-axis', 'y-axis', 'z-axis']\n",
"for col, label in zip(rog.results.T, labels):\n",
" plt.plot(col, label=label)\n",
"plt.legend()\n",
"plt.ylabel('Radius of gyration (Å)')\n",
"plt.xlabel('Frame');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can also re-run the analysis with different frame selections. \n",
"\n",
"Below, we start from the 10th frame and take every 8th frame until the 80th. Note that the slice includes the `start` frame, but does not include the `stop` frame index (much like the actual `range()` function)."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"execution": {
"iopub.execute_input": "2021-05-19T05:45:46.997610Z",
"iopub.status.busy": "2021-05-19T05:45:46.996736Z",
"iopub.status.idle": "2021-05-19T05:45:47.008365Z",
"shell.execute_reply": "2021-05-19T05:45:47.008817Z"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/lily/anaconda3/envs/mda-user-guide/lib/python3.7/site-packages/MDAnalysis/analysis/base.py:282: DeprecationWarning: The structure of the `results` array will change in MDAnalysis version 2.0.\n",
" \"MDAnalysis version 2.0.\", category=DeprecationWarning\n"
]
},
{
"data": {
"text/plain": [
"(10, 4)"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rog_10 = AnalysisFromFunction(radgyr, u.trajectory, \n",
" protein, protein.masses, \n",
" total_mass=np.sum(protein.masses))\n",
"\n",
"rog_10.run(start=10, stop=80, step=7)\n",
"rog_10.results.shape"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"execution": {
"iopub.execute_input": "2021-05-19T05:45:47.026036Z",
"iopub.status.busy": "2021-05-19T05:45:47.021412Z",
"iopub.status.idle": "2021-05-19T05:45:47.153405Z",
"shell.execute_reply": "2021-05-19T05:45:47.153774Z"
},
"scrolled": false
},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 0, 'Frame')"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"for col, label in zip(rog_10.results.T, labels):\n",
" plt.plot(col, label=label)\n",
"plt.legend()\n",
"plt.ylabel('Radius of gyration (Å)')\n",
"plt.xlabel('Frame');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Transforming a function into a class\n",
"\n",
"While the `AnalysisFromFunction` is convenient for quick analyses, you may want to turn your function into a class that can be applied to many different trajectories, much like other MDAnalysis analyses.\n",
"\n",
"You can apply `analysis_class` to any function that you can run with `AnalysisFromFunction` to get a class."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"execution": {
"iopub.execute_input": "2021-05-19T05:45:47.158522Z",
"iopub.status.busy": "2021-05-19T05:45:47.157956Z",
"iopub.status.idle": "2021-05-19T05:45:47.159704Z",
"shell.execute_reply": "2021-05-19T05:45:47.160090Z"
}
},
"outputs": [],
"source": [
"RadiusOfGyration = analysis_class(radgyr)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To run the analysis, pass exactly the same arguments as you would for `AnalysisFromFunction`."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"execution": {
"iopub.execute_input": "2021-05-19T05:45:47.164528Z",
"iopub.status.busy": "2021-05-19T05:45:47.163876Z",
"iopub.status.idle": "2021-05-19T05:45:47.223088Z",
"shell.execute_reply": "2021-05-19T05:45:47.223864Z"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/lily/anaconda3/envs/mda-user-guide/lib/python3.7/site-packages/MDAnalysis/analysis/base.py:282: DeprecationWarning: The structure of the `results` array will change in MDAnalysis version 2.0.\n",
" \"MDAnalysis version 2.0.\", category=DeprecationWarning\n"
]
},
{
"data": {
"text/plain": [
".WrapperClass at 0x7fb6bec3b610>"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rog_u1 = RadiusOfGyration(u.trajectory, protein, \n",
" protein.masses,\n",
" total_mass=np.sum(protein.masses))\n",
"rog_u1.run();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As with `AnalysisFromFunction`, the results are in `results`."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"execution": {
"iopub.execute_input": "2021-05-19T05:45:47.235361Z",
"iopub.status.busy": "2021-05-19T05:45:47.234354Z",
"iopub.status.idle": "2021-05-19T05:45:47.386475Z",
"shell.execute_reply": "2021-05-19T05:45:47.386946Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 0, 'Frame')"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"for col, label in zip(rog_u2.results.T, labels):\n",
" plt.plot(col, label=label)\n",
"plt.legend()\n",
"plt.ylabel('Radius of gyration (Å)')\n",
"plt.xlabel('Frame');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Creating your own class\n",
"\n",
"Although `AnalysisFromFunction` and `analysis_class` are convenient, they can be too limited for complex algorithms. You may need to write your own class.\n",
"\n",
"MDAnalysis provides the `MDAnalysis.analysis.base.AnalysisBase` class as a template for creating multiframe analyses. This class automatically sets up your trajectory reader for iterating, and includes an optional progress meter. \n",
"\n",
"The analysis is always run by calling `run()`. `AnalysisFromFunction` actually subclasses `AnalysisBase`, and `analysis_class` returns a subclass of `AnalysisFromFunction`, so the behaviour of `run()` remains identical.\n",
"\n",
"### 1. Define `__init__`\n",
"You can define a new analysis by subclassing AnalysisBase. Initialise the analysis with the `__init__` method, where you *must* pass the trajectory that you are working with to `AnalysisBase.__init__()`. You can also pass in the `verbose` keyword. If `verbose=True`, the class will set up a progress meter for you.\n",
"\n",
"### 2. Define your analysis in `_single_frame()` and other methods\n",
"Implement your functionality as a function over each frame of the trajectory by defining `_single_frame()`. This function gets called for each frame of your trajectory. \n",
"\n",
"You can also define `_prepare()` and `_conclude()` to set your analysis up before looping over the trajectory, and to finalise the results that you have prepared. In order, `run()` calls:\n",
"\n",
" - `_prepare()`\n",
" - `_single_frame()` (for each frame of the trajectory that you are iterating over)\n",
" - `_conclude()`\n",
"\n",
"Class subclassed from AnalysisBase can make use of several properties when defining the methods above:\n",
"\n",
" - `self.start`: frame index to start analysing from. Defined in `run()`\n",
" - `self.stop`: frame index to stop analysis. Defined in `run()`\n",
" - `self.step`: number of frames to skip in between. Defined in `run()`\n",
" - `self.n_frames`: number of frames to analyse over. This can be helpful in initialising result arrays.\n",
" - `self._verbose`: whether to be verbose.\n",
" - `self._trajectory`: the actual trajectory\n",
" - `self._ts`: the current timestep object\n",
" - `self._frame_index`: the index of the currently analysed frame. This is *not* the absolute index of the frame in the trajectory overall, but rather the relative index of the frame within the list of frames to be analysed. You can think of it as the number of times that `self._single_frame()` has already been called.\n",
" \n",
"Below, we create the class `RadiusOfGyration2` to run the analysis function that we have defined above, and add extra information such as the time of the corresponding frame."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"execution": {
"iopub.execute_input": "2021-05-19T05:45:47.588068Z",
"iopub.status.busy": "2021-05-19T05:45:47.586645Z",
"iopub.status.idle": "2021-05-19T05:45:47.589492Z",
"shell.execute_reply": "2021-05-19T05:45:47.589917Z"
}
},
"outputs": [],
"source": [
"class RadiusOfGyration2(AnalysisBase): # subclass AnalysisBase\n",
" \n",
" def __init__(self, atomgroup, verbose=True):\n",
" \"\"\"\n",
" Set up the initial analysis parameters.\n",
" \"\"\"\n",
" # must first run AnalysisBase.__init__ and pass the trajectory\n",
" trajectory = atomgroup.universe.trajectory\n",
" super(RadiusOfGyration2, self).__init__(trajectory,\n",
" verbose=verbose)\n",
" # set atomgroup as a property for access in other methods\n",
" self.atomgroup = atomgroup\n",
" # we can calculate masses now because they do not depend\n",
" # on the trajectory frame.\n",
" self.masses = self.atomgroup.masses\n",
" self.total_mass = np.sum(self.masses)\n",
" \n",
" def _prepare(self):\n",
" \"\"\"\n",
" Create array of zeroes as a placeholder for results.\n",
" This is run before we begin looping over the trajectory.\n",
" \"\"\"\n",
" # This must go here, instead of __init__, because\n",
" # it depends on the number of frames specified in run().\n",
" self.results = np.zeros((self.n_frames, 6))\n",
" # We put in 6 columns: 1 for the frame index, \n",
" # 1 for the time, 4 for the radii of gyration\n",
" \n",
" def _single_frame(self):\n",
" \"\"\"\n",
" This function is called for every frame that we choose\n",
" in run().\n",
" \"\"\"\n",
" # call our earlier function\n",
" rogs = radgyr(self.atomgroup, self.masses,\n",
" total_mass=self.total_mass)\n",
" # save it into self.results\n",
" self.results[self._frame_index, 2:] = rogs\n",
" # the current timestep of the trajectory is self._ts\n",
" self.results[self._frame_index, 0] = self._ts.frame\n",
" # the actual trajectory is at self._trajectory\n",
" self.results[self._frame_index, 1] = self._trajectory.time\n",
" \n",
" def _conclude(self):\n",
" \"\"\"\n",
" Finish up by calculating an average and transforming our\n",
" results into a DataFrame.\n",
" \"\"\"\n",
" # by now self.result is fully populated\n",
" self.average = np.mean(self.results[:, 2:], axis=0)\n",
" columns = ['Frame', 'Time (ps)', 'Radius of Gyration',\n",
" 'Radius of Gyration (x-axis)',\n",
" 'Radius of Gyration (y-axis)',\n",
" 'Radius of Gyration (z-axis)',]\n",
" self.df = pd.DataFrame(self.results, columns=columns)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Because `RadiusOfGyration2` calculates the masses of the selected AtomGroup itself, we do not need to pass it in ourselves."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"execution": {
"iopub.execute_input": "2021-05-19T05:45:47.598314Z",
"iopub.status.busy": "2021-05-19T05:45:47.597633Z",
"iopub.status.idle": "2021-05-19T05:45:47.684015Z",
"shell.execute_reply": "2021-05-19T05:45:47.683397Z"
},
"scrolled": true
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "4288ee805e9244e19932a236e7f290b7",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/98 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"rog_base = RadiusOfGyration2(protein, verbose=True).run()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As calculated in `_conclude()`, the average radii of gyrations are at `rog.average`."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"execution": {
"iopub.execute_input": "2021-05-19T05:45:47.691297Z",
"iopub.status.busy": "2021-05-19T05:45:47.690130Z",
"iopub.status.idle": "2021-05-19T05:45:47.693665Z",
"shell.execute_reply": "2021-05-19T05:45:47.694259Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([18.26549552, 12.85342131, 15.37359575, 16.29185734])"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rog_base.average"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The results are available at `rog.results` as an array or `rog.df` as a DataFrame."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"execution": {
"iopub.execute_input": "2021-05-19T05:45:47.700493Z",
"iopub.status.busy": "2021-05-19T05:45:47.699598Z",
"iopub.status.idle": "2021-05-19T05:45:47.714227Z",
"shell.execute_reply": "2021-05-19T05:45:47.714684Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"