{
 "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": {}
  }
 ]
}