Phase response curves firing rate dependency of rat purkinje neurons in vitro (Couto et al 2015)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:155735
NEURON implementation of stochastic gating in the Khaliq-Raman Purkinje cell model. NEURON implementation of the De Schutter and Bower model of a Purkinje Cell. Matlab scripts to compute the Phase Response Curve (PRC). LCG configuration files to experimentally determine the PRC. Integrate and Fire models (leaky and non-leaky) implemented in BRIAN to see the influence of the PRC in a network of unconnected neurons receiving sparse common input.
Reference:
1 . Couto J, Linaro D, De Schutter E, Giugliano M (2015) On the firing rate dependency of the phase response curve of rat Purkinje neurons in vitro. PLoS Comput Biol 11:e1004112 [PubMed]
2 . Linaro D, Couto J, Giugliano M (2014) Command-line cellular electrophysiology for conventional and real-time closed-loop experiments. J Neurosci Methods 230:5-19 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Neuron or other electrically excitable cell;
Brain Region(s)/Organism:
Cell Type(s): Cerebellum Purkinje GABA cell;
Channel(s):
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON; MATLAB; Brian; LCG; Python;
Model Concept(s): Phase Response Curves;
Implementer(s): Couto, Joao [jpcouto at gmail.com];
Search NeuronDB for information about:  Cerebellum Purkinje GABA cell;
/
pkj_prc
brian
README
integrateAndFirePRC.ipynb
integrateAndFirePRC.py
lif_prc_study.pdf
                            
{
 "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": {}
  }
 ]
}