{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Fraction of native contacts over a trajectory\n",
"\n",
"Here, we calculate the native contacts of a trajectory as a fraction of the native contacts in a given reference.\n",
"\n",
"**Last executed:** Feb 29, 2020 with MDAnalysis 0.20.1\n",
"\n",
"**Last updated:** January 2020\n",
"\n",
"**Minimum version of MDAnalysis:** 0.21.0\n",
"\n",
"**Packages required:**\n",
" \n",
"* MDAnalysis (Michaud-Agrawal *et al.*, 2011, Gowers *et al.*, 2016)\n",
"* MDAnalysisTests\n",
" \n",
"**Optional packages for visualisation:**\n",
"\n",
"* [matplotlib](https://matplotlib.org)\n",
"* [pandas](https://pandas.pydata.org)\n",
"\n",
"
\n",
" \n",
"**Note**\n",
"\n",
"The `contacts` module contains 3 metrics for calculating the fraction of native contacts for a conformation:\n",
"\n",
"1. `hard_cut_q`: atoms *i* and *j* are in contact if they are *at least* as close as in the given reference structure\n",
"2. `soft_cut_q`: atoms *i* and *j* are in contact based on a soft potential with user-defined parameters (Best *et al.*, 2013)\n",
"3. `radius_cut_q`: atoms *i* and *j* are in contact if they are within a given radius (Franklin *et al.*, 2007)\n",
"\n",
"
"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import MDAnalysis as mda\n",
"from MDAnalysis.tests.datafiles import PSF, DCD\n",
"from MDAnalysis.analysis import contacts\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"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)\n",
" The trajectory ``DCD`` samples a transition from a closed to an open conformation."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"u = mda.Universe(PSF, DCD)\n",
"ref = mda.Universe(PSF, DCD)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Defining the groups for contact analysis"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We define salt bridges as contacts between NH/NZ in ARG/LYS and OE\\*/OD\\* in ASP/GLU. You may not want to use this definition for real work."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"sel_basic = \"(resname ARG LYS) and (name NH* NZ)\"\n",
"sel_acidic = \"(resname ASP GLU) and (name OE* OD*)\"\n",
"acidic = u.select_atoms(sel_acidic)\n",
"basic = u.select_atoms(sel_basic)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Calculating fraction of native contacts, with a distance lower than or equal to the reference structure"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`contacts.Contacts` supports each of the three methods explained above. It must be defined with a `selection` of two groups that change over time. The fraction of native contacts present in `selection` are with respect to contacts found in `refgroup`: two contacting groups in a reference configuration. Native contacts are found in the reference group `refgroup` based on the radius.\n",
"\n",
"Below, we just use the atomgroups in the universe at the current frame as a reference."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"ca1 = contacts.Contacts(u, \n",
" selection=(sel_acidic, sel_basic),\n",
" refgroup=(acidic, basic), \n",
" radius=4.5, \n",
" method='hard_cut').run()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The results are available as a numpy array at `ca1.timeseries`. The first column is the frame, and the second is the fraction of contacts present in that frame."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Frame
\n",
"
Contacts from first frame
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
0.0
\n",
"
1.000000
\n",
"
\n",
"
\n",
"
1
\n",
"
1.0
\n",
"
0.492754
\n",
"
\n",
"
\n",
"
2
\n",
"
2.0
\n",
"
0.449275
\n",
"
\n",
"
\n",
"
3
\n",
"
3.0
\n",
"
0.507246
\n",
"
\n",
"
\n",
"
4
\n",
"
4.0
\n",
"
0.463768
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Frame Contacts from first frame\n",
"0 0.0 1.000000\n",
"1 1.0 0.492754\n",
"2 2.0 0.449275\n",
"3 3.0 0.507246\n",
"4 4.0 0.463768"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ca1_df = pd.DataFrame(ca1.timeseries, \n",
" columns=['Frame', \n",
" 'Contacts from first frame'])\n",
"ca1_df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that the data is presented as fractions of the native contacts present in the reference configuration. In order to find the number of contacts present, multiply the data with the number of contacts in the reference configuration. Initial contact matrices are saved as pairwise arrays in `ca1.initial_contacts`."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(70, 44)"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ca1.initial_contacts[0].shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can sum this to work out the number of contacts in your reference, and apply that to the fractions of references in your `timeseries` data."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"There are 69 contacts in the reference.\n"
]
}
],
"source": [
"n_ref = ca1.initial_contacts[0].sum()\n",
"print('There are {} contacts in the reference.'.format(n_ref))"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[69. 34. 31. 35. 32.]\n"
]
}
],
"source": [
"n_contacts = ca1.timeseries[:, 1] * n_ref\n",
"print(n_contacts[:5])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Plotting"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'Fraction of contacts')"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEGCAYAAABo25JHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOzdd3xc5ZX4/88Z9S5bkuUiWS5INm5yw4VikUAInRBS6GWTEKdns5vdkPy+y+5mSdgksCEJZQlLJyGkkJDECQEDNgSDLeMCuMhyVbHVbPUund8fUzSSpkmasSR03q+XXtbcuXPn0fXMPfd5zlNEVTHGGDNxOUa7AMYYY0aXBQJjjJngLBAYY8wEZ4HAGGMmOAsExhgzwUWPdgGGKjMzU2fNmjXaxTDGmHFl+/bttaqa5eu5cRcIZs2aRXFx8WgXwxhjxhUROervOWsaMsaYCc4CgTHGTHAWCIwxZoIbdzkCY8ayrq4uysvLaW9vH+2imAkqPj6enJwcYmJiQn6NBQJjwqi8vJyUlBRmzZqFiIx2ccwEo6rU1dVRXl7O7NmzQ35dxJqGRORREakWkff8PC8i8hMRKRWR3SKyPFJlMeZ0aW9vJyMjw4KAGRUiQkZGxpBrpJHMETwOXBzg+UuAfNfP7cCDESyLMaeNBQEzmobz+YtYIFDVzcDJALtcBTypTm8B6SIyLdhxq5s6wlVEY4wxjG6voRlAmdfjcte2QUTkdhEpFpHi6kZLwhkTyIkTJ7j22muZO3cuCxYs4NJLL6WkpGRYx/rxj39Ma2vrsF67c+dONmzYMKTX/OQnP+HMM8/khhtuGNZ7hqqmpobVq1ezbNkyXn/9dS699FLq6+tDfv3jjz9OZWWlz+f27dvH0qVLWbZsGQcPHgxXkSNqNAOBr/qLz1VyVPVhVV2pqisjXCZjxjVV5eqrr+b888/n4MGD7Nmzh+9973tUVVUN63inOxA88MADbNiwgWeeeabf9u7u7mGVwZ+NGzcyf/58duzYwXnnnceGDRtIT0/vt4+q0tvb6/P1gQLB73//e6666ip27NjB3LlzQzreqFPViP0As4D3/Dz3v8B1Xo/3A9OCHTN26hna09OrxoxFe/bsGdX337hxo5533nk+n+vt7dV//ud/1oULF+qiRYv02WefVVXVV199VYuKivSaa67RefPm6fXXX6+9vb163333aUxMjC5atEjPP/98VVVdv369rlixQhcsWKD/9m//5jn21q1bde3atbpkyRI966yztL6+XnNzczUzM1MLCwv12Wef1ddee00LCwu1sLBQly5dqo2Njf3K9/nPf97zfvfee6/eeeed+rnPfU4/8pGP6HXXXadtbW1666236qJFi3Tp0qX6yiuvqKrqY489pldddZVefvnlOmvWLP3pT3+q99xzjy5dulRXr16tdXV1/d5nx44d/crW2tqqeXl5WlNTo4cPH9b58+frF77wBV26dKkeOXJEb7nlFs85u/fee/XXv/61JiUlaUFBgef1bn/+8581Oztbp0+frueff77P4/k7h3l5eXrHHXfomjVrdMWKFbp9+3a96KKLdM6cOfrggw969vvBD36gK1eu1MWLF/d7vTdfn0OgWP1dq/09EY6fIIHgMuAvOGsGa4CtoRwzduoZ2t7V7fOPN2a0eX8B//2F9/RTD70Z1p9/f+G9gO9/33336de//nWfz/3mN7/RCy+8ULu7u/XEiROam5urlZWV+uqrr2pqaqqWlZVpT0+PrlmzRl9//XVVVc8F0s19Ue3u7taioiLdtWuXdnR06OzZs3Xr1q2qqtrQ0KBdXV362GOP6Ze+9CXPay+//HJ94403VFW1qalJu7q6BpXR+/3uvPNOXb58uedC+6Mf/UhvvfVWVVXdu3ev5ubmaltbmz722GM6d+5cbWxs1Orqak1NTfVcOL/+9a/r//zP/wx6n4Fl8w4EIqJbtmxRVdXi4mK98MILPfudOnVKVVWLiop027ZtPs/znXfeqT/84Q9VVQcdz985dJfhgQce8JR78eLFnr8pKytLVVVffPFF/dznPqe9vb3a09Ojl112mW7atGlQGYYaCCLZffSXwBZgnoiUi8hnRGS9iKx37bIBOASUAj8Hvhjqsbt6bJ1lY4bqjTfe4LrrriMqKors7GyKiorYtm0bAKtWrSInJweHw8HSpUs5cuSIz2M899xzLF++nGXLlvH++++zZ88e9u/fz7Rp0zjrrLMASE1NJTp68BClc845h2984xv85Cc/ob6+3uc+A1155ZUkJCR4yn/TTTcBMH/+fPLy8jy5jw996EOkpKSQlZVFWloaV1xxBQCLFy/2+7f4k5eXx5o1awCYM2cOhw4d4itf+Qp//etfSU1NHdKx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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"ca1_df.plot(x='Frame')\n",
"plt.ylabel('Fraction of contacts')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Calculating fraction of native contacts, with pairs assigned based on a soft potential"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`refgroup` can either be two contacting groups in a reference configuration, or a list of tuples of two contacting groups. Below, we set the reference trajectory to its last frame and select another pair of contacting atomgroups."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"ref.trajectory[-1]\n",
"acidic_2 = ref.select_atoms(sel_acidic)\n",
"basic_2 = ref.select_atoms(sel_basic)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This time we will use the `soft_cut_q` algorithm to calculate contacts by setting `method='soft_cut'`. This method uses the soft potential below to determine if atoms are in contact:\n",
"\n",
"$$ Q(r, r_0) = \\frac{1}{1 + e^{\\beta (r - \\lambda r_0)}} $$\n",
"\n",
"$r$ is a distance array and $r0$ are the distances in the reference group. $\\beta$ controls the softness of the switching function and $\\lambda$ is the tolerance of the reference distance.\n",
"\n",
"Suggested values for $\\lambda$ is 1.8 for all-atom simulations and 1.5 for coarse-grained simulations. The default value of $\\beta$ is 5.0. To change these, pass `kwargs` to contacts.Contacts."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"ca2 = contacts.Contacts(u, selection=(sel_acidic, sel_basic),\n",
" refgroup=[(acidic, basic), (acidic_2, basic_2)], \n",
" radius=4.5, \n",
" method='soft_cut',\n",
" kwargs={'beta': 5.0,\n",
" 'lambda_constant': 1.5}).run()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Again, the first column of the data array in `ca2.timeseries` is the frame. The next columns of the array are fractions of native contacts with reference to the `refgroup`s passed, in order."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"