{ "metadata": { "name": "", "signature": "sha256:82273e4a45a8fa2c6dd2aa8920aa6894b0feb97609f52d0e06e770d2a5f2ce46" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "#Integrate and fire study for the Phase Response Curve \n", "__Goal:__ Assess the effect of flat and phase dependent response curves in the overall synchronization of groups of neurons receiving common inputs.\n", "\n", "Joao Couto - jpcouto@gmail.com\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Find the external current for 30Hz firing frequency\n", "Creates non-leaky and leaky integrate and fire models as example of flat and phase dependent response curves.\n", "Uses scipy.optimize.fmin to find the baseline current needed to evoke 30Hz firing in each models for use in subsequent steps. " ] }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline\n", "import brian as b\n", "import pylab as plt\n", "import numpy as np\n", "b.set_global_preferences(use_weave=True)\n", "\n", "tau = 10*b.ms # membrane time constant\n", "Vr = 0*b.mV # Reset voltage\n", "Vt = 15*b.mV # Threshold voltage\n", "\n", "eqs_leak = '''\n", "dV/dt = (-V+Iext)/tau : volt\n", "Iext: volt\n", "'''\n", "eqs_noleak = '''\n", "dV/dt = (Iext)/tau : volt\n", "Iext: volt\n", "'''\n", "N = 1\n", "# Neuron groups for leaky and non-leaky integrate and fire\n", "G_leak=b.NeuronGroup(N, model=eqs_leak, reset=Vr, threshold=Vt)\n", "G_noleak=b.NeuronGroup(N, model=eqs_noleak, reset=Vr, threshold=Vt)\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "targetF = 30.0\n", "spks_leak = b.SpikeMonitor(G_leak,record=True)\n", "spks_noleak = b.SpikeMonitor(G_noleak,record=True)\n", "\n", "def search_current_for_freq(x,target,model,spkcounter):\n", " '''\n", " Minimization for the firing frequency parameter estimation\n", " '''\n", " model.Iext = x*b.mA\n", " spkcounter.reinit()\n", " b.run(0.1*b.second)\n", " if not len(spkcounter.spiketimes[0]):\n", " rate = 0.0\n", " else:\n", " rate = np.mean(1.0/np.diff(spkcounter.spiketimes[0]))\n", " #print(rate,model.Iext)\n", " return abs(rate-target)\n", "\n", "from scipy.optimize import fmin\n", "\n", "P = fmin(search_current_for_freq, 17.0, \n", " args=(targetF,G_leak,spks_leak), disp = 0, full_output=0)\n", "Iext_leak = P[0]\n", "P = fmin(search_current_for_freq, 17.0, \n", " args=(targetF,G_noleak,spks_noleak), disp = 0, full_output=0)\n", "Iext_no_leak = P[0]\n", "\n", "print('''The current necessary to evoke {0}Hz \n", "firing is {1:.3} and {2:.3} mA for the leaky and non-leaky \n", "models respectively.'''.format(int(targetF),Iext_leak*b.mA, Iext_no_leak*b.mA))\n" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "The current necessary to evoke 30Hz \n", "firing is 0.0156 and 0.00452 mA for the leaky and non-leaky \n", "models respectively.\n" ] } ], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Compute the phase response curve\n", "Plots figure to compare phase response curves of the leaky and non-leaky models. Persistent re-init and removal of parameters slows down computations, could improve by performing simulations on population of neurons to compute PRC in parallel, but keeping like this for simplicity." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def compute_prc_point(model,ref,phase=0.5,exportV=False):\n", " '''\n", " Function to compute the spike advance in response to a stimulus.\n", " '''\n", " b.reinit()\n", " G_leak.Iext = Iext_leak*b.mA\n", " G_noleak.Iext = Iext_no_leak*b.mA\n", " Ipert = 100*b.pA\n", " if exportV:\n", " V = b.StateMonitor(model,'V',record=True)\n", " spks = b.SpikeMonitor(model,record=True)\n", " # Stimulation\n", " stim_time = [(0,ref[0] + phase*(np.diff(ref))*b.second)]\n", " perturbation=b.SpikeGeneratorGroup(1,stim_time)\n", " connection=b.Connection(perturbation,model,'V')\n", " connection[0,0]=1*b.mV\n", " b.run(tstop)\n", " del perturbation,connection\n", " #print ref,spks[0],spks[0][4]\n", " spk_advance = spks[0][4]-ref[0]\n", " if exportV:\n", " tmp = V[0].copy()/b.mV\n", " del V\n", " return spk_advance, tmp\n", " \n", " return spk_advance\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "# This is the part that takes longer. Not optimized.\n", "b.reinit() # So that we go back to zero (there must be a better way..)\n", "\n", "G_leak.Iext = Iext_leak*b.mA\n", "G_noleak.Iext = Iext_no_leak*b.mA\n", "\n", "\n", "# Run it once to find the reference spiketimes\n", "spks_leak = b.SpikeMonitor(G_leak,record=True)\n", "spks_noleak = b.SpikeMonitor(G_noleak,record=True)\n", "\n", "V_leak = b.StateMonitor(G_leak,'V',record=True)\n", "V_noleak = b.StateMonitor(G_noleak,'V',record=True)\n", "\n", "tstop = 0.25 * b.second\n", "b.run(tstop)\n", "\n", "ref_leak = spks_leak.spiketimes[0][3:5]\n", "ref_noleak = spks_noleak.spiketimes[0][3:5]\n", "# For plotting\n", "time = V_leak.times.copy()\n", "Vref_leak = V_leak[0].copy()/b.mV\n", "Vref_noleak = V_noleak[0].copy()/b.mV\n", "del V_leak,V_noleak,spks_leak,spks_noleak\n", "\n", "[spk_advance,tmpV_leak]=compute_prc_point(G_leak,ref_leak,exportV=True)\n", "[spk_advance,tmpV_noleak]=compute_prc_point(G_noleak,ref_noleak,exportV=True)\n", "\n", "# Phase response computation\n", "phase = np.linspace(0,1,50) # Change resolution of the phase response curve\n", "spk_advance_leak = np.zeros(phase.shape)\n", "spk_advance_noleak = np.zeros(phase.shape)\n", "\n", "for ii,phi in enumerate(phase):\n", " spk_advance_leak[ii]=compute_prc_point(G_leak,ref_leak,phi)\n", " spk_advance_noleak[ii]=compute_prc_point(G_noleak,ref_noleak,phi)\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "# Redefine the model groups to include more neurons\n", "b.reinit()\n", "\n", "N = 5000\n", "# Neuron groups for leaky and non-leaky integrate and fire\n", "G_leak=b.NeuronGroup(N, model=eqs_leak, reset=Vr, threshold=Vt)\n", "G_noleak=b.NeuronGroup(N, model=eqs_noleak, reset=Vr, threshold=Vt)\n", "\n", "G_leak.Iext = Iext_leak*b.mA\n", "G_noleak.Iext = Iext_no_leak*b.mA\n", "\n", "# Initialize equal sampling of phase\n", "G_noleak.V = np.linspace(Vr,Vt,N)\n", "\n", "fTh = lambda x:(Iext_leak*b.mV)-((Iext_leak*b.mV)-Vt)/(np.exp(-x/tau))\n", "x = -np.linspace(-1./(targetF*b.Hz),0*b.ms,N+1)[1:]\n", "G_leak.V = fTh(x)\n", "\n", "stim_time = []\n", "np.random.seed(seed=9192037)\n", "for ii in (200+400*np.cumsum(abs(b.rand(100))))*b.ms:#np.linspace(200,800,10):\n", " stim_time.append((0,ii))\n", "\n", "perturbation = b.SpikeGeneratorGroup(1,stim_time)\n", "connection_leak = b.Connection(perturbation,G_leak)\n", "connection_noleak = b.Connection(perturbation,G_noleak)\n", "for ii in range(N):\n", " connection_leak[0,ii] = 0.3*b.mV\n", " connection_noleak[0,ii] = 0.3*b.mV\n", "\n", "spks_leak = b.SpikeMonitor(G_leak,record=True)\n", "spks_noleak = b.SpikeMonitor(G_noleak,record=True)\n", "\n", "#rate_leak=b.PopulationRateMonitor(G_leak,bin=3*b.ms)\n", "#rate_noleak=b.PopulationRateMonitor(G_noleak,bin=3*b.ms)\n", "\n", "b.run(5*b.second)\n", "\n", "all_spks_leak = np.hstack([spks_leak[ii] for ii in range(N)])\n", "all_spks_noleak = np.hstack([spks_noleak[ii] for ii in range(N)])\n", "edges = np.arange(0,5,0.01)\n", "bins_leak,edges = np.histogram(all_spks_leak,edges,density=False)\n", "bins_noleak,edges = np.histogram(all_spks_noleak,edges,density=False)\n", "\n", "#plt.figure()\n", "#b.raster_plot(spks_leak,spks_noleak,showgrouplines=True)\n", "#plt.figure()\n", "#plt.plot(rate_leak.smooth_rate(width=5*b.ms,filter='gaussian'))\n", "#plt.plot(rate_noleak.smooth_rate(width=5*b.ms,filter='gaussian'))\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 6 }, { "cell_type": "code", "collapsed": false, "input": [ "# Gather the entire figure and print it\n", "%matplotlib inline\n", "from matplotlib import rcParams\n", "rcParams['xtick.direction'] = 'out'\n", "rcParams['ytick.direction'] = 'out'\n", "rcParams['font.sans-serif'] = 'arial'\n", "rcParams['font.size'] = 8\n", "fig = plt.figure(figsize = (6.92,5.92))\n", "ax=list()\n", "ax.append(fig.add_axes([0.1,0.77,0.35,0.18]))\n", "ax.append(fig.add_axes([0.58,0.77,0.35,0.18]))\n", "ax.append(fig.add_axes([0.07,0.54,0.4,0.15]))\n", "ax.append(fig.add_axes([0.52,0.54,0.4,0.15]))\n", "ax.append(fig.add_axes([0.1,0.3,0.85,0.15]))\n", "ax.append(fig.add_axes([0.1,0.1,0.85,0.15]))\n", "fig.text(0.05,0.95,'A',fontsize=10,verticalalignment='bottom',\n", " horizontalalignment='right')\n", "fig.text(0.50,0.95,'B',fontsize=10,verticalalignment='bottom',\n", " horizontalalignment='right')\n", "fig.text(0.05,0.69,'C',fontsize=10,verticalalignment='bottom',\n", " horizontalalignment='right')\n", "fig.text(0.06,0.63,'non-leaky',fontsize=9,verticalalignment='center',\n", " horizontalalignment='right',rotation=90)\n", "#fig.text(0.5,0.69,'D',fontsize=10,verticalalignment='bottom',\n", "# horizontalalignment='right')\n", "fig.text(0.51,0.63,'leaky',fontsize=9,verticalalignment='center',\n", " horizontalalignment='right',rotation=90)\n", "fig.text(0.05,0.48,'D',fontsize=10,verticalalignment='bottom',\n", " horizontalalignment='right')\n", "fig.text(0.15,0.45,'non-leaky',fontsize=9,verticalalignment='bottom',\n", " horizontalalignment='left',rotation=0)\n", "fig.text(0.15,0.25,'leaky',fontsize=9,verticalalignment='bottom',\n", " horizontalalignment='left',rotation=0)\n", "\n", "try: # In case this was not ran move along.\n", " # Voltage trajectories\n", " ax[0].plot(time/b.mV,Vref_leak,color='black')\n", " ax[0].plot(time/b.mV,Vref_noleak,'-',color='gray')\n", " ax[0].plot(time/b.mV,tmpV_leak,color='r')\n", " ax[0].plot(time/b.mV,tmpV_noleak,'-',color=[.5,0,0])\n", " ax[0].set_xlim((ref_leak+np.array([-0.005,+0.005]))/b.mV)\n", " ax[0].set_xlabel('time (ms)')\n", " ax[0].set_ylabel('Voltage (mV)')\n", "\n", " # Phase response curves for each model\n", " ax[1].plot(phase,1-(spk_advance_leak/np.diff(ref_leak)),color='black')\n", " ax[1].plot(phase,1-(spk_advance_noleak/np.diff(ref_noleak)),color='gray')\n", " ax[1].axis('tight')\n", " ax[1].plot([0.5,0.5],ax[1].get_ylim(),'--',color='red')\n", " ax[1].set_xlabel('phase ($\\phi$)')\n", " ax[1].set_ylabel('phase advance ($\\Delta\\phi$)')\n", "except:\n", " pass\n", "# Pick 10 random neurons\n", "NN = 15\n", "tmin=0.15\n", "tmax = 1.5\n", "for ii in stim_time:\n", " if (ii[1]>tmin) & (ii[1] < tmax):\n", " ax[2].plot([0,0]+ii[1],[0,NN],'-',color='red',lw=0.7)\n", "for ii,i in enumerate(np.linspace(0, N-1, num=NN).astype('int32')):\n", " sp = spks_noleak[i][(spks_noleak[i]>tmin) & (spks_noleak[i]<tmax)]\n", " X = np.tile(sp,(2,1))\n", " Y = np.transpose(np.tile(np.transpose([ii,ii+0.6]),(len(sp),1))+0)\n", " ax[2].plot(X,Y,color='black',lw=1)\n", "ax[2].axis('tight')\n", "\n", "for ii in stim_time:\n", " if (ii[1]>tmin) & (ii[1] < tmax):\n", " ax[3].plot([0,0]+ii[1],[0,NN],'-',color='red',lw=0.7)\n", "for ii,i in enumerate(np.linspace(0, N-1, num=NN).astype('int32')):\n", " sp = spks_leak[i][(spks_leak[i]>tmin) & (spks_leak[i]<tmax)]\n", " X = np.tile(sp,(2,1))\n", " Y = np.transpose(np.tile(np.transpose([ii,ii+0.6]),(len(sp),1))+0)\n", " ax[3].plot(X,Y,color='black',lw=1)\n", "ax[3].axis('tight')\n", "\n", "# Fix axes properties \n", "ax[-1].fill_between(edges[:-1]+np.diff(edges)/2,bins_leak/(N*(np.diff(edges[:2]))),where=bins_leak>=0, \n", " interpolate=False,color='black',edgecolor=None)\n", "plt.hold(True)\n", "ax[-2].fill_between(edges[:-1]+np.diff(edges)/2,bins_noleak/(N*(np.diff(edges[:2]))),where=bins_noleak>=0, \n", " interpolate=False,color='black',edgecolor=None)#align='center',width=min(np.diff(edges)),edgecolor=None,\n", "\n", "ax[-1].set_xlabel('time (s)')\n", "for a in ax[4:6]:\n", " a.set_xlim([0,max(edges)])\n", " a.set_ylim([0,90])\n", " a.set_ylabel('Population Rate (Hz)')\n", " for ii in stim_time:\n", " a.plot([0,0]+ii[1],plt.gca().get_ylim(),'--',color='red')\n", "ax[-2].xaxis.set_visible(False)\n", "for a in ax:\n", " a.set_axisbelow(True)\n", " a.spines['top'].set_visible(False)\n", " a.spines['right'].set_visible(False)\n", " a.spines['left'].set_visible(True)\n", " a.spines['bottom'].set_visible(True)\n", " a.yaxis.set_ticks_position('left')\n", " a.xaxis.set_ticks_position('bottom')\n", " for line in a.xaxis.get_ticklines():\n", " line.set_markeredgewidth(1)\n", " for line in a.yaxis.get_ticklines():\n", " line.set_markeredgewidth(1)\n", "\n", "for a in ax[2:4]:\n", " a.spines['left'].set_visible(False)\n", " a.yaxis.set_visible(False)\n", " a.set_xlabel('time (s)')\n", "\n", "figurepath = 'lif_prc_study'\n", "fig.savefig('{0}.pdf'.format(figurepath))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "text": [ "<matplotlib.figure.Figure at 0x10f356950>" ] } ], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": {}, "source": [ "#Optimization of phase sampling\n", "Equal sampling on the phase space can be obtained by using different initial conditions.\n", "The initial conditions can be calculated as follows." ] }, { "cell_type": "code", "collapsed": false, "input": [ "x = np.linspace(0*b.ms,1./((targetF)*b.Hz),N+1)[1:]\n", "fTh = lambda x:(Iext_leak*b.mV)-((Iext_leak*b.mV)-Vt)/(np.exp(-x/tau))\n", "\n", "plot(x[1:]/b.ms,fTh(x[1:])/b.mV)\n", "xlabel('time to spike (ms)')\n", "ylabel('initial condition (mV)')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 36, "text": [ "<matplotlib.text.Text at 0x11b681250>" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "<matplotlib.figure.Figure at 0x11b626510>" ] } ], "prompt_number": 36 }, { "cell_type": "code", "collapsed": false, "input": [ "\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 37 } ], "metadata": {} } ] }