Skip to content

Instantly share code, notes, and snippets.

@ChrisWellsWood
Created April 20, 2018 13:54
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ChrisWellsWood/9cd8b56a946ce20a31a3b54dde7dec4c to your computer and use it in GitHub Desktop.
Save ChrisWellsWood/9cd8b56a946ce20a31a3b54dde7dec4c to your computer and use it in GitHub Desktop.
Grid Scanning Parameters in ISAMBARD
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Fitting Parameters with a Grid Scan"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import nglview as nv\n",
"import numpy\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import budeff\n",
"import isambard.specifications as specifications\n",
"import isambard.modelling as modelling"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def show_ball_and_stick(ampal):\n",
" view = nv.show_text(ampal.pdb)\n",
" view.add_ball_and_stick()\n",
" view.remove_cartoon()\n",
" return view"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Fitting Parameters"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"When performing parametric modelling, you might not but sure of the parameters that you should use to best model a given sequence, in this case we can fit parameters for a given sequence. If we use some generic parameters they might not fit our model."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"dimer_exp_params = specifications.CoiledCoil(2)\n",
"dimer_exp_params = modelling.pack_side_chains_scwrl(\n",
" dimer_exp_params,\n",
" ['EIAALKQEIAALKKENAALKWEIAALKQ', 'EIAALKQEIAALKKENAALKWEIAALKQ']\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "8bfdcc6da4a740348da94b1c5d7ff2b7",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"NGLWidget()"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"show_ball_and_stick(dimer_exp_params)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If you zoom into the core of this model, you should be able to see a pair of asparagines that are clashing as the parameters are not ideal for the sequence. Let's try and optimise the parameters to resolve this clash."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Grid Scan"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The simplest form of parameter fitting is to perform a grid scan where we uniformly sample parameters across a range of allowed values. Let's perform a grid scan of radius vs interface angle for a dimer. First of all we can define the range of parameter values we want to explore."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"radii = numpy.arange(4, 6, 0.2) # (min, max, step)\n",
"interface_angles = numpy.arange(10, 30, 2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next we'll write a little function to build a model from a radius and interface angle value. We're keeping pitch fixed as this has the smallest overall impact on the model quality."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"REGISTER_ADJUST = {\n",
" 'a': 0,\n",
" 'b': 102.8,\n",
" 'c': 205.6,\n",
" 'd': 308.4,\n",
" 'e': 51.4,\n",
" 'f': 154.2,\n",
" 'g': 257\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"def build_dimer(radius, interface_angle):\n",
" sequences = ['EIAALKQEIAALKKENAALKWEIAALKQ', 'EIAALKQEIAALKKENAALKWEIAALKQ']\n",
" gs_dimer = specifications.CoiledCoil.from_parameters(\n",
" 2, 28, radius, 160, REGISTER_ADJUST['g']+interface_angle)\n",
" gs_dimer = modelling.pack_side_chains_scwrl(gs_dimer, sequences)\n",
" return gs_dimer"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Finally we can create an array (a 2D matrix) to hold our results using numpy, and we can populate the grid positions with the BUFF score of each of the corresponding models."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 15.8 s, sys: 939 ms, total: 16.7 s\n",
"Wall time: 24.2 s\n"
]
}
],
"source": [
"%%time\n",
"# I'm recording how long this takes, we'll come back to this later!\n",
"results_array = numpy.empty((len(radii), len(interface_angles)))\n",
"for i, radius in enumerate(radii):\n",
" for j, interface_angle in enumerate(interface_angles):\n",
" dimer_model = build_dimer(radius, interface_angle)\n",
" results_array[i][j] = budeff.get_internal_energy(dimer_model).total_energy"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can plot a heatmap of the array to show which parameters have the best scores!"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.colorbar.Colorbar at 0x7f3604228e10>"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.imshow(results_array)\n",
"plt.ylabel('Radius (Å)')\n",
"plt.xlabel('Interface Angle (°)')\n",
"plt.yticks(range(len(radii)), ['{:.1f}'.format(x) for x in radii])\n",
"plt.xticks(range(len(interface_angles)), interface_angles)\n",
"plt.colorbar()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The model with a radius of 4.4 and interface angle of 18 is the best, let have a look at the model."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"best_dimer = build_dimer(4.4, 18)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<BUFF Score -953.35: 54.69 St | -504.94 De | -503.10 Ch>"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"budeff.get_internal_energy(best_dimer)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "e71e833c20274c37997c9cd6dc8b9f28",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"NGLWidget()"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"show_ball_and_stick(best_dimer)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If you zoom in on the asparagine residues in the core, you should see that they are now forming a nice hydrogen-bonding network. Neat!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> ### Problem\n",
"> Try performing a finer grid scan around the best parameters found by the last grid scan. Stick to at most 100 models or it might take a long time to finish."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Parallelising a Grid Scan"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As each of the models in a grid is independent, it's trivial to parallelise. We need to set the problem up in a slightly different way, removing the nested loop used above."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"import itertools\n",
"import multiprocessing"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can use `itertools.product` create all the pairs of parameter values along with the indices, which we'll use to plot the data."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"parameter_pairs = list(itertools.product(radii, interface_angles))"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[(4.0, 10), (4.0, 12), (4.0, 14), (4.0, 16), (4.0, 18)]\n"
]
}
],
"source": [
"print(parameter_pairs[:5])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As you can see, the parameter pairs are created in the same order as they were in the for loop above.\n",
"Now we need a little function that takes one of these tuples as an input, creates our model and returns the indices with the score."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"def build_model_from_pair(parameter_pair):\n",
" radius, interface_angle = parameter_pair\n",
" dimer_model = build_dimer(radius, interface_angle)\n",
" score = budeff.get_internal_energy(dimer_model).total_energy\n",
" return score"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we can [\"map\"](https://docs.python.org/3/library/functions.html#map) this function to our input. We can parallelise this with `multiprocessing`! I'm going to use 4 processes, but use as many as you like/have available."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 17.3 ms, sys: 23.3 ms, total: 40.6 ms\n",
"Wall time: 9.15 s\n"
]
}
],
"source": [
"%%time\n",
"with multiprocessing.Pool(processes=4) as pool:\n",
" results = pool.map(build_model_from_pair, parameter_pairs)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Nice, looks like we got around a 3x speed up. You might have expected a 4x speed up, but unfortunately this type of parallelism suffers from [the law of diminishing returns](https://en.wikipedia.org/wiki/Diminishing_returns) as there is overhead associated with managing the processes. But still, it's a decent speedup, and if you have access to HPC, you can *really* crank up the scale.\n",
"\n",
"As the results are in the correct order, we can use numpy to take the flat list and create an array with the correct dimension so we can plot it."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"parallel_results_array = numpy.array(results).reshape((len(radii), len(interface_angles)))"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.colorbar.Colorbar at 0x7f35fff0c240>"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.imshow(parallel_results_array)\n",
"plt.ylabel('Radius (Å)')\n",
"plt.xlabel('Interface Angle (°)')\n",
"plt.yticks(range(len(radii)), ['{:.1f}'.format(x) for x in radii])\n",
"plt.xticks(range(len(interface_angles)), interface_angles)\n",
"plt.colorbar()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Awesome, looks like the results are the same, just as expected."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Conclusions"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"When the parameter space that you want to explore is small, a grid scan is a good option. You can scale up the model building through parallelisation using the [multiprocessing](https://docs.python.org/3/library/multiprocessing.html) module, based on your available resources. However, as you introduce more parameters, it quickly becomes very inefficient to perform a grid scan, and so other methods of parameter fitting are preferred."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment