Source code for lif

# lif.py ---
#
# Filename: lif.py
# Description:
# Author:Subhasis Ray
# Maintainer:
# Created: Sun Jul  8 14:00:31 2012 (+0530)
# Version:
# Last-Updated: Tue Jul 17 16:45:44 2012 (+0530)
#           By: subha
#     Update #: 187
# URL:
# Keywords:
# Compatibility:
#
#

# Commentary:
#
# Demonstrates use of Leaky Integrate and Fire (LeakyIaf class) in
# moose.
#
#

# Change log:
#
#
#
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 3, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; see the file COPYING.  If not, write to
# the Free Software Foundation, Inc., 51 Franklin Street, Fifth
# Floor, Boston, MA 02110-1301, USA.
#
#

# Code:

"""
    Demonstrates use of Leaky Integrate and Fire (LeakyIaf class) in moose.
"""

import sys
import os

import moose
import matplotlib.pyplot as plt
import numpy as np

[docs]def setupmodel(modelpath, iaf_Rm, iaf_Cm, pulse_interval): """Create a LeakyIaF neuron under `modelpath` and a synaptic channel (SynChan) in it. Create a spike generator stimulated by a pulse generator to give input to the synapse. """ model_container = moose.Neutral(modelpath) data_container = moose.Neutral(datapath) iaf = moose.LIF('%s/iaf' % (modelpath)) iaf.Rm = iaf_Rm iaf.Cm = iaf_Cm iaf.initVm = -0.070 iaf.Em = -0.065 #iaf.Vreset = -0.070 iaf.thresh = -0.055 # iaf.refractoryPeriod = 0.005 syn = moose.SynChan('%s/syn' % (iaf.path)) synh = moose.SimpleSynHandler( syn.path + '/synh' ) moose.connect( synh, 'activationOut', syn, 'activation' ) synh.synapse.num = 1 synh.synapse[0].delay = 0.01 syn.Ek = 0.0 syn.Gbar = 1.0 moose.connect(syn, 'channel', iaf, 'channel') moose.connect(iaf, 'VmOut', syn, 'Vm') sg = moose.SpikeGen('%s/spike' % (modelpath)) sg.threshold = 0.1 moose.connect(sg, 'spikeOut', synh.synapse[0], 'addSpike') pg = moose.PulseGen('%s/pulse' % (modelpath)) pg.delay[0] = pulse_interval pg.width[0] = 1e-3 pg.level[0] = 0.5 moose.connect(pg, 'output', sg, 'Vm') return { 'model': model_container, 'iaf': iaf, 'synchan': syn, 'spikegen': sg, 'pulsegen': pg }
if __name__ == '__main__': modelpath = '/lif_demo' datapath = '/data' simtime = 1.0 setup = setupmodel(modelpath, 127e6, 7.8e-11, 0.1) # Setup data recording data_container = moose.Neutral(datapath) vm_table = moose.Table('%s/vm' % (data_container.path)) moose.connect(vm_table, 'requestOut', setup['iaf'], 'getVm') spike_table = moose.Table('%s/spike' % (data_container.path)) # Can't connect this, the types don't match. #moose.connect(spike_table, 'requestOut', setup['spikegen'], 'getHasFired') # moose.connect(setup['iaf'], 'VmOut', spike_table, 'spike') pulse_table = moose.Table('%s/pulse' % (data_container.path)) moose.connect(pulse_table, 'requestOut', setup['pulsegen'], 'getOutputValue') gsyn_table = moose.Table('%s/gk' % (datapath)) moose.connect(gsyn_table, 'requestOut', setup['synchan'], 'getIk') # Schedule model components for simulation moose.setClock(0, 1e-4) moose.setClock(1, 1e-4) moose.setClock(2, 1e-4) moose.setClock(3, 1e-4) moose.useClock(0, '%s,%s' % (setup['pulsegen'].path, setup['spikegen'].path), 'process') moose.useClock(1, setup['synchan'].path, 'process') moose.useClock(2, setup['iaf'].path, 'process') moose.useClock(3, '%s/##' % (datapath), 'process') # Initialize and run simulation moose.reinit() moose.start(simtime) t = np.linspace(0, simtime, len(pulse_table.vector)) plt.plot(t, pulse_table.vector, 'r', label='Input pulse') plt.plot(t, vm_table.vector, 'b', label='Vm') plt.plot(t, gsyn_table.vector, 'c', label='Isyn') plt.legend() plt.show() # # lif.py ends here