#!/usr/bin/env python
####
# This script is used to simulate a stochastic HH neuron model incorporating channel noise.
# It uses configuration files (see the included example) to determine the characteristics
# of the neuron to be simulated.
#
# Author: Daniele Linaro - daniele.linaro@unige.it
# Date: September 2010
####
###
# FUNCTIONS
###
def printHelp(scriptname):
print('\nUsage: ' + scriptname + ' [options]\n')
print('\twhere options are:\n');
print('\t\t-f --conf-file: parse the specified configuration file.\n')
print('\t\t-h --help: print this help message.\n')
print('\nAuthor: Daniele Linaro -- daniele.linaro@unige.it\n')
def checkDuplicates(filename):
import os
s = filename.split('.')
if len(s) > 1:
s = [filename[0:-(len(s[-1])+1)], s[-1]]
suffix = 0
while os.path.isfile(filename):
suffix = suffix + 1
filename = s[0] + '_' + str(suffix)
if len(s) > 1:
filename = filename + '.' + s[1]
return filename
###
from sys import argv, stdout
import os
import time
if len(argv) == 2 and (argv[1] == '-h' or argv[1] == '--help'):
printHelp(argv[0])
exit(1)
conffile = 'neuron.cfg'
if len(argv) > 2:
if argv[1] == '-f' or argv[1] == '--config-file':
conffile = argv[2]
else:
printHelp(argv[0])
exit(1)
from ConfigParser import ConfigParser
if not os.path.isfile(conffile):
printHelp(argv[0])
print(conffile + ' is not a valid configuration file. Aborting...')
exit(1)
fid = open(conffile,'r')
config = ConfigParser()
config.readfp(fid)
fid.close()
from neuron import h
from nrn import Section
import numpy
## stimulus properties
stimprop = {'delay': config.getfloat('Stimulus','delay'),
'dur': config.getfloat('Stimulus','duration'),
'amp': config.getfloat('Stimulus','amplitude')}
## soma properties
type = config.get('Neuron','type')
L = config.getfloat('Neuron','length')
gamma_na = config.getfloat('Neuron','gamma_na')
gamma_k = config.getfloat('Neuron','gamma_k')
diam = config.getfloat('Neuron','diameter')
Ra = 35.4
## stuff
savedata = config.get('Misc','savedata').lower()
savespikes = config.get('Misc','savespikes').lower()
showplot = config.get('Misc','showplot').lower();
saveplot = config.get('Misc','saveplot').lower()
## build the neuron
soma = Section() # Create the soma of our single-compartment model
soma.L = L # [um] length of the soma
soma.diam = diam # [um] diameter of the soma
soma.nseg = 1 # number of segments: 1 means a single-compartment model
soma.cm = 1.0 # [uF] membrane capacitance
soma.Ra = Ra # [Ohm cm] citoplasmic resistance
if type.lower() == 'effective':
soma.insert('HHcn') # insert effective HH mechanism
mechanism = soma(0.5).HHcn
elif type.lower() == 'microscopic':
soma.insert('HHmicro') # insert microscopic HH mechanism
mechanism = soma(0.5).HHmicro
else:
print('Unknown neuron type: ' + type)
exit(1)
mechanism.gamma_na = gamma_na
mechanism.gamma_k = gamma_k
mechanism.seed = round(numpy.random.rand() * 10000)
## stimulus
stimulus = h.IClamp(soma(0.5))
stimulus.delay = stimprop['delay']
stimulus.dur = stimprop['dur']
stimulus.amp = stimprop['amp']
dt = 0.001
tstop = stimprop['dur'] + 2*stimprop['delay']
## recorders for time and membrane voltage
if savedata == 'yes' or showplot == 'yes':
t = numpy.arange(0,tstop+dt,dt)
recorders = {}
labels = ['v']
for lbl in labels:
recorders[lbl] = h.Vector(t)
recorders['v'].record(soma(0.5)._ref_v)
## a spike counter
apc = h.APCount(soma(0.5))
apc.thresh = 0
spikes = h.Vector()
apc.record(spikes)
## run the simulation
h.load_file('stdrun.hoc')
h.tstop = tstop
h.dt = dt
stdout.write('\n\n||| Started on ' + time.strftime('%a, %d %b %Y %H:%M:%S', time.localtime()) + '. |||\n\n')
stdout.write('>>> Simulating the ' + type + ' HH model for ' + str(h.tstop) + ' ms. <<<\n')
stdout.flush()
start = time.time()
h.run()
stop = time.time()
stdout.write('>>> Elapsed time: ' + str(int(stop-start)) + ' seconds. <<<\n')
stdout.flush()
## save the results
id = '_' + type + '_amp='+('%.3f' % stimprop['amp']) + \
'_gamma_na='+str(gamma_na) + '_gamma_k='+str(gamma_k) + \
'_L='+str(L) + '_diam='+str(diam)
if savedata == 'yes':
ds = 10
suffix = 0
datafile = checkDuplicates('voltage' + id + '.dat')
data = numpy.zeros((len(recorders)+1,len(t[::ds])))
data[0,:] = t[::ds]
for k,lbl in enumerate(labels):
data[k+1,:] = numpy.array(recorders[lbl])[::ds]
numpy.savetxt(datafile,data.transpose(),'%.4f')
if savespikes == 'yes':
suffix = 0
spikesfile = checkDuplicates('spikes' + id + '.dat')
numpy.savetxt(spikesfile, numpy.array(spikes), '%.6f')
## plot the results
if showplot == 'yes' or saveplot == 'yes':
from pylab import figure, plot, show, xlabel, ylabel
figure()
plot(t,recorders['v'],'k')
xlabel('t (ms)')
ylabel('V (mV)')
show()
if saveplot == 'yes':
from pylab import savefig
suffix = 0
plotfile = checkDuplicates('voltage' + id + '.eps')
savefig(plotfile)
stdout.write('\n||| Ended on ' + time.strftime('%a, %d %b %Y %H:%M:%S', time.localtime()) + '. |||\n\n')
stdout.flush()