#!/usr/bin/env python
"""produces voltage and current traces for Figure 1B-E"""
# _title_ : model_stim.py
# _author_ : Katharina Anna Wilmes
# _mail_ : katharina.anna.wilmes __at__ cms.hu-berlin.de
# --Imports--
import sys
import os
import math
from time import time
import matplotlib.pyplot as plt
import numpy as np
import neuron
from neuron import h
from neuronmodel import *
from config_model_stim import *
from sim import *
path = './'
SCEN = 3
NO_REPS = 1
RESET = True
DT=0.1 # ms, set the integration step
POST_AMP = 0.3# nA, amplitude of current injection to trigger the AP/bAP
WARM_UP=1000 # ms
AP_DELAY = 0 #ms, AP needs 4ms after stimulation to become initiated
identifier = '2015-01-13-00h00m00s'
savepath = '%s%s'%(path,identifier)
if not os.path.exists(savepath):
os.mkdir(savepath)
def _get_current_trace(freq,delta_t,t_stop,pre=False,test=True) :
trace = np.zeros(t_stop/DT)
for i in range(NO_REPS) :
if(pre) :
start_t = (0 + i* (1000.0/freq) + WARM_UP)
else :
start_t = (0 + delta_t - AP_DELAY + i* (1000.0/freq) + WARM_UP)
end_t = (start_t+2)
if(test) :
print 'start_t=%g, end_t=%g (t_stop=%g, len(trace)=%f)' % (start_t,end_t,t_stop,len(trace))
trace[start_t/DT:end_t/DT] = POST_AMP
return trace
def create_syn(syn_type,pos, thresh):
syn = h.ExpSynSTDP(pos)
syn.thresh = thresh
return syn
def main():
my_rawdata = {}
#inputs
freq = params['Input']['freq'].value
wee = params['Input']['wee'].value
wee_strong = params['Input']['wee_strong'].value
# Synapses
scen = SCEN
delta_t = params['STDP']['delta_t'].value
sim_params = params['sim']
source = False
cell = Neuron()
sim = Simulation(cell,sim_params)
sim.dt = DT
sim.v_init = -70
total_time = WARM_UP+NO_REPS*(1000.0/freq)+100
if (scen == 1) or (scen == 3):
# trigger AP/bAP
ic = h.IClamp(cell.soma(0.5))
ic.delay = 0
ic.dur=1e9
current_trace = _get_current_trace(freq,delta_t,total_time,pre=False)
current_vec = h.Vector(current_trace)
current_vec.play(ic._ref_amp,DT)
if (scen == 2) or (scen == 3) or (scen==4):
# distal excitation
syn = h.Exp2Syn(cell.branches[0](0.1))
if scen == 4:
# strong distal excitation
weight = wee_strong
else:
weight = wee
syn.e = 0
syn.tau1 = 0.5
syn.tau2 = 2
interval = 1000.0/freq
exstim = h.NetStim()
exstim.number = NO_REPS
exstim.interval = interval
exstim.start = WARM_UP
exstim.noise= 0
nc = h.NetCon(exstim,syn,0,0,weight)
sim.sim_time = total_time
# recording
trec = h.Vector()
trec.record(h._ref_t)
vrec = h.Vector()
vrec.record(cell.soma(0.5)._ref_v)
vdrec = h.Vector()
vdrec.record(cell.branches[0](0.5)._ref_v)
vbrec = h.Vector()
vbrec.record(cell.basal_main(0.5)._ref_v)
vorec = h.Vector()
vorec.record(cell.oblique_branch(0.9)._ref_v)
if (scen == 2) or (scen == 4):
currentrec = h.Vector()
currentrec.record(syn._ref_i)
# record state vars
vit2m, vit2h, vscam, vscah, vkcan, vna3dendm, vna3dendh = [h.Vector() for x in xrange(7)]
vit2m.record(cell.branches[0](0.5).it2._ref_m)
vit2h.record(cell.branches[0](0.5).it2._ref_h)
vscam.record(cell.branches[0](0.5).sca._ref_m)
vscah.record(cell.branches[0](0.5).sca._ref_h)
vkcan.record(cell.branches[0](0.5).kca._ref_n)
vna3dendm.record(cell.branches[0](0.5).na3dend._ref_m)
vna3dendh.record(cell.branches[0](0.5).na3dend._ref_h)
# run simulation
sim.go()
t = np.array(trec)
v = np.array(vrec)
vd = np.array(vdrec)
vb = np.array(vbrec)
vo = np.array(vorec)
it2m = np.array(vit2m)
it2h = np.array(vit2h)
scam = np.array(vscam)
scah = np.array(vscah)
kcan = np.array(vkcan)
na3dendm = np.array(vna3dendm)
na3dendh = np.array(vna3dendh)
# plot traces
if scen == 1:
step = np.array(current_vec)
x = np.arange(len(step))
plt.figure()
plt.plot(x*DT,step,'k',label='vd')
plt.xlim((990,1100))
plt.ylim((0,3.6))
plt.xlabel("Time [ms]", fontsize = 'large')
plt.ylabel("Current [nA]", fontsize = 'large')
plt.savefig('%s/step.eps'%(savepath))
if (scen == 2) or (scen == 4):
crec = np.array(currentrec)
x = np.arange(len(crec))
plt.figure()
plt.plot(x*DT,abs(crec),'r',label='vd')
plt.xlim((990,1100))
plt.ylim((0,3.6))
plt.xlabel("Time [ms]", fontsize = 'large')
plt.ylabel("Current [nA]", fontsize = 'large')
plt.savefig('%s/crec%d.eps'%(savepath,scen))
plt.figure()
plt.plot(t,v,'k',label='v')
plt.hold(True)
plt.plot(t,vd,'r',label='vd')
plt.xlabel("Time [ms]", fontsize = 'large')
plt.xlim((990,1100))
plt.ylim((-80,40))
plt.ylabel("Voltage [mV]", fontsize = 'large')
plt.savefig('%s/vrec%d.eps'%(savepath,scen))
plt.figure()
plt.plot(t,it2m,'k-',label='v')
plt.hold(True)
plt.plot(t,it2h,'k--',label='v')
plt.plot(t,scam,'r-',label='v')
plt.plot(t,scah,'r--',label='v')
plt.plot(t,kcan,'g-',label='vd')
plt.plot(t,na3dendm,'m-',label='v')
plt.plot(t,na3dendh,'m--',label='v')
plt.xlabel("Time [ms]", fontsize = 'large')
plt.xlim((990,1100))
#plt.ylim((-80,40))
plt.ylabel("state", fontsize = 'large')
plt.savefig('%s/statevars%d.eps'%(savepath,scen))
# delete
del(cell)
del(sim)
del(trec);del(vrec)
my_rawdata['t'] = t
my_rawdata['v'] = v
my_rawdata['vd'] = vd
my_rawdata['vb'] = vb
my_rawdata['vo'] = vo
my_rawdata['it2m'] = it2m
my_rawdata['it2h'] = it2h
my_rawdata['scam'] = scam
my_rawdata['scah'] = scah
my_rawdata['kcan'] = kcan
my_rawdata['na3dendm'] = na3dendm
my_rawdata['na3dendh'] = na3dendh
rawdata = {'raw_data': my_rawdata}
return rawdata
if __name__ == '__main__':
rawdata = main()