#!/usr/bin/env python """produces data for table with voltage traces in Figures 3A and 4A, """ # _title_ : traces.py # _author_ : Katharina Anna Wilmes # _mail_ : katharina.anna.wilmes __at__ cms.hu-berlin.de # --Imports-- import sys import os import math import matplotlib.pyplot as plt import numpy as np from time import time import neuron from neuron import h from neuronmodel import * from config_traces_ca import * from sim import * # set path for saving data path = './' NO_REPS = 1 RESET = True DT=0.1 # ms, set the integration step POST_AMP = 0.3# nA, amplitude of current injection to trigger AP/bAP WARM_UP=1000 # ms, until steady state AP_DELAY = 4 #ms, AP needs 4ms after stimulation to become initiated identifier = '2015-01-13-00h00m00s' # folder name 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 traces(t, AP, AP_distal, AP_oblique, AP_basal, inh_times, scen, path=None): site = [AP, AP_distal, AP_oblique, AP_basal] sitename = ['axon','distal','oblique','basal'] # Plot data fig = plt.figure(1) plt.clf() plt.axes([0.125,0.2,0.95-0.125,0.95-0.2]) a = np.ones((len(inh_times))) * -75 for i in range(1,5): ax = plt.subplot(2,2,i, autoscale_on = False) p2 = plt.plot(t,site[i-1],'k', lw=1, label = 'scenario') plt.hold(True) plt.plot(inh_times, a, '|',color = '#FF8300') plt.axis(xmin = 990, xmax = 1100, ymin=-80, ymax=50) plt.yticks(np.arange(-80,50,10)) plt.title(sitename[i-1]) plt.savefig('%s/publish%s.eps'%(path, scen)) def main(): my_rawdata = {} # inputs freq = params['Input']['freq'].value wee = params['Input']['wee'].value wee_strong = params['Input']['wee_strong'].value # Scenario scen = params['Synapse']['scen'].value #shunt_pos = params['Synapse']['shunt_pos'].value delta_t = params['STDP']['delta_t'].value sim_params = params['sim'] # inhibition shunt_params = params['shunt'] distal_shunt_weight = params['shunt']['distal_shunt_weight'].value proximal_shunt_weight = params['shunt']['proximal_shunt_weight'].value basal_shunt_weight = params['shunt']['basal_shunt_weight'].value distal_shunt_pos = params['shunt']['distal_shunt_pos'].value proximal_shunt_pos = params['shunt']['proximal_shunt_pos'].value basal_shunt_pos = params['shunt']['basal_shunt_pos'].value distal_shunt_compartment = params['shunt']['distal_shunt_compartment'] proximal_shunt_compartment = params['shunt']['proximal_shunt_compartment'] basal_shunt_compartment = params['shunt']['basal_shunt_compartment'] basal_shunt_delay = params['shunt']['basal_shunt_delay'].value freq_i = params['Synapse']['interneuron_frequency'].value reps_inh = params['Synapse']['interneuron_reps'].value shunt_delay = params['shunt']['shunt_delay'].value shunt_pos_range = np.arange(4) source = False for shunt_pos in shunt_pos_range: cell = Neuron() sim = Simulation(cell,sim_params) sim.dt = DT sim.v_init = -70 total_time = WARM_UP+NO_REPS*(1000.0/freq)+100 interval = 1000.0/freq # somatic stimulation ic = h.IClamp(cell.soma(0.5)) ic.delay = 0 ic.dur=1e9 #print 'testing freq F=%g (t_stop=%i)' % (freq,total_time) 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) # additional distal excitation to trigger calcium spike if scen == 3: syn = h.Exp2Syn(cell.branches[0](0.1)) weight = wee syn.e = 0 syn.tau1 = 0.5 syn.tau2 = 2 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) inh_delay = WARM_UP + delta_t - AP_DELAY + shunt_delay basal_inh_delay = WARM_UP + delta_t - AP_DELAY + basal_shunt_delay # inhibition if shunt_pos == 0: print "no inhibition" elif shunt_pos == 1: # distal sim.set_Shunt(shunt_params, distal_shunt_pos, distal_shunt_weight, distal_shunt_compartment,source,inh_delay,NO_REPS, interval) elif shunt_pos == 2: # proximal sim.set_Shunt(shunt_params, proximal_shunt_pos, proximal_shunt_weight, proximal_shunt_compartment,source,inh_delay,NO_REPS,interval) elif shunt_pos == 3: # basal for i in np.arange(NO_REPS): sim.set_Shunt(shunt_params, basal_shunt_pos, basal_shunt_weight,basal_shunt_compartment,source,basal_inh_delay+i*interval,no_reps=reps_inh,interval=1000.0/freq_i) else: raise ValueError # recording trec = h.Vector() trec.record(h._ref_t) vrec = h.Vector() vrec.record(cell.soma(0.5)._ref_v) varec = h.Vector() varec.record(cell.ais(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 == 3: currentrec = h.Vector() currentrec.record(syn._ref_i) if not shunt_pos == 0: ipsc = neuron.h.Vector() ipsc.record(sim.shunt[0]._ref_i) sim.set_synaptic_current_rec() sim.set_synaptic_cond_rec() # 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) sim.sim_time = total_time if not shunt_pos == 0: sim.set_synaptic_recording(switch=False,all=False) sim.go() t = np.array(trec) v = np.array(vrec) vd = np.array(vdrec) vb = np.array(vbrec) vo = np.array(vorec) va = np.array(varec) 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) if not shunt_pos == 0: inh_rec = sim.get_synaptic_recording('dendritic_inh') ipsc_rec = sim.get_synaptic_current_rec() inhcond = sim.get_synaptic_cond_rec() else: inh_rec = np.zeros(1) ipsc_rec = np.zeros(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 == 3) and (shunt_pos == 0): 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_scen%d_shuntpos%d.eps'%(savepath,scen,shunt_pos)) 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_scen%d_shuntpos%d.eps'%(savepath,scen,shunt_pos)) 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_scen%d_shuntpos%d.eps'%(savepath,scen,shunt_pos)) traces(t,va,vd,vo,vb,inh_rec,"shunt_%d"%(shunt_pos),savepath) my_rawdata['t'] = t my_rawdata['v'] = v my_rawdata['vd'] = vd my_rawdata['vb'] = vb my_rawdata['vo'] = vo my_rawdata['va'] = va 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 my_rawdata['inh_times'] = inh_rec if not shunt_pos == 0: my_rawdata['ipsc'] = ipsc_rec my_rawdata['inh_cond'] = inhcond #my_rawdata['currentv'] = currentv rawdata = {'raw_data': my_rawdata} return rawdata if __name__ == '__main__': rawdata = main()