Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save neuromusic/f5386570156590801087 to your computer and use it in GitHub Desktop.
Save neuromusic/f5386570156590801087 to your computer and use it in GitHub Desktop.
generating KlustaKwik graphs from the geometries
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# generating KlustaKwik graphs from the geometries\n",
"\n",
"*Justin Kiggins, May 2015 (justin.kiggins@gmail.com / @neuromusic)*\n",
"\n",
"Very large arrays make it unrealistic to manually define the probe architectures that SpikeDetekt2 expects. This example builds a `channel_groups` dictionary for a large array. It was inspired by the [dense silicon arrays designed by Ed Boyden's group](http://syntheticneurobiology.org/publications/publicationdetail/234/25):\n",
"\n",
"![Close-Packed Silicon Microelectrodes for Scalable Spatially Oversampled Neural Recording](http://syntheticneurobiology.org/uploads/15.02.scholvin.jpg \"Close-Packed Silicon Microelectrodes for Scalable Spatially Oversampled Neural Recording\")\n",
"\n",
"*5 shanks with 200 sites each and just 11 microns pitch between sites*\n",
"\n",
"### first, we need to be able to convert a geometry into a graph\n",
"\n",
"we'll define a function which takes the `geometry` dict, extracts the coordinates, and uses the Delaunary transformation to generate a triangular tesselation. It then returns this graph in the form that SpikeDetekt2 expects"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from scipy import spatial\n",
"def get_graph_from_geometry(geometry):\n",
" \n",
" # let's transform the geometry into lists of channel names and coordinates\n",
" chans,coords = zip(*[(ch,xy) for ch,xy in geometry.iteritems()])\n",
" \n",
" # we'll perform the triangulation and extract the \n",
" tri = spatial.Delaunay(coords)\n",
" \n",
" # then build the list of edges from the triangulation\n",
" indices, indptr = tri.vertex_neighbor_vertices\n",
" edges = []\n",
" for k in range(indices.shape[0]-1):\n",
" for j in indptr[indices[k]:indices[k+1]]:\n",
" edges.append((chans[k],chans[j]))\n",
" return edges"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Now, we can build the probe definition from a few basic parameters\n",
"This is suitable to write directly to a `*.prb` file for SpikeDetekt2"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"w = 2 # the width of the grid of sites\n",
"l = 100 # the length of the grid of sites\n",
"n_shanks = 5 # the number of shanks\n",
"pitch = 11 # site spacing in microns\n",
"\n",
"channel_groups = {}\n",
"for sh in range(n_shanks):\n",
" # define the channels on this shank\n",
" channels = [sh*w*l+ch for ch in range(w*l)]\n",
" \n",
" # get the physical coordinates by including the spacing\n",
" row_col = [(ch/w,ch%w) for ch in [c%(w*l) for c in channels]]\n",
" coords = [(pitch*c, pitch*(l-1)-pitch*r) for r,c in row_col]\n",
" \n",
" # then assign these to the geometry dictionary\n",
" geometry = {ch:xy for ch,xy in zip(channels,coords)}\n",
"\n",
" # finally, use our function from above to define the graph\n",
" graph = get_graph_from_geometry(geometry)\n",
"\n",
" channel_groups[sh] = {\n",
" 'channels': channels,\n",
" 'graph': graph,\n",
" 'geometry': geometry,\n",
" }"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Did it work?\n",
"Let's plot it."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fc0cbf1fcd0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%pylab inline\n",
"import seaborn as sns\n",
"sns.set_context(rc={'lines.markeredgewidth': 0.1})\n",
"sns.set_style('white')\n",
"\n",
"f,ax = plt.subplots(1,n_shanks)\n",
"for sh in range(n_shanks):\n",
" coords = [xy for ch,xy in channel_groups[sh]['geometry'].iteritems()]\n",
" \n",
" for pr in channel_groups[sh]['graph']:\n",
" points = [channel_groups[sh]['geometry'][p] for p in pr]\n",
" ax[sh].plot(*zip(*points),color='k',alpha=0.2)\n",
" \n",
" ax[sh].set_xlim(-5,pitch*(w-1)+5)\n",
" ax[sh].set_ylim(-5,pitch*(w-1)*n_shanks+5)\n",
" ax[sh].set_xticks([])\n",
" ax[sh].set_yticks([])\n",
" ax[sh].set_title('shank %i'%sh)\n",
" ax[sh].scatter(*zip(*coords),color='0.2')\n",
" sns.despine()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.9"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment