#!/usr/bin/env python """plasticity pairing protocol used in Figure 6, S2 and S5""" # _title_ : pairingprotocol.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_pairing import * from sim import * path = './' NO_REPS = 5 # 100 pairings RESET = True DT=0.1 # ms, set the integration step POST_AMP = 0.3 # nA, amplitude of current injection to trigger the POST-synaptic spike WARM_UP=1000 # ms AP_DELAY = 4 #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, w_max, potentiation_factor, depression_factor): syn = h.ExpSynSTDP(pos) syn.thresh = thresh syn.wmax = w_max syn.dd == depression_factor syn.dp = potentiation_factor return syn def main(): my_rawdata = {} #inputs freq = params['Input']['freq'].value # Synapses pos = params['set_me']['pos'].value shunt_pos = params['set_me']['shunt_pos'].value syn_type = params['Synapse']['syn_type'] freq_i = params['Synapse']['interneuron_frequency'].value reps_inh = params['Synapse']['interneuron_reps'].value total_distal_weight = params['Synapse']['total_distal_weight'].value proximal_shunt_pos = params['shunt']['proximal_shunt_pos'].value distal_shunt_pos = params['shunt']['distal_shunt_pos'].value basal_shunt_pos = params['shunt']['basal_shunt_pos'].value proximal_shunt_compartment = params['shunt']['proximal_shunt_compartment'] distal_shunt_compartment = params['shunt']['distal_shunt_compartment'] basal_shunt_compartment = params['shunt']['basal_shunt_compartment'] shunt_delay = params['shunt']['shunt_delay'].value 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 basal_shunt_delay = params['shunt']['basal_shunt_delay'].value thresh = params['STDP']['thresh'].value ca_thresh = params['STDP']['ca_thresh'].value potentiation_factor = params['STDP']['potentiation_factor'].value depression_factor = params['STDP']['depression_factor'].value w_max = params['STDP']['w_max'].value sim_params = params['sim'] shunt_params = params['shunt'] source = False delta_t_range = np.arange(-20,21,1) weight_change = np.zeros((len(delta_t_range))) for i, delta_t in enumerate(delta_t_range): print "iteration %d from %d"%(i+1,len(delta_t_range)) cell = Neuron() sim = Simulation(cell,sim_params) sim.dt = DT sim.v_init = -70 # set plastic synapses if pos == 1: syn = create_syn(syn_type,cell.basal_main(0.5),thresh, w_max, potentiation_factor, depression_factor) weight = params['Synapse']['basal_weight'].value elif pos == 2: syn = create_syn(syn_type,cell.oblique_branch(0.5),thresh, w_max, potentiation_factor, depression_factor) weight = params['Synapse']['oblique_weight'].value elif pos == 3: #syn = create_syn(syn_type,cell.branches[0](0.1),thresh) syn = h.ExpSynCaSTDP(cell.branches[0](0.1)) weight = params['Synapse']['distal_weight'].value else: raise ValueError exnc = h.List() interval = 1000.0/freq exstim = h.NetStim() exstim.number = NO_REPS exstim.interval = interval exstim.start = WARM_UP exstim.noise= 0 exnc.append(h.NetCon(exstim,syn,0,0,weight)) if pos == 3: # distal excitation to trigger calcium spike syn1 = h.Exp2Syn(cell.branches[0](0.1)) syn1.e = 0 syn1.tau1 = 0.5 syn1.tau2 = 2 weight1 = total_distal_weight-weight exnc.append(h.NetCon(exstim,syn1,0,0,weight1)) # somatic current injection to trigger postsynaptic spike ic = h.IClamp(cell.soma(0.5)) ic.delay = 0 ic.dur=1e9 total_time = WARM_UP+NO_REPS*(1000.0/freq)+100 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) sim.sim_time = total_time 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, shunt_weight, distal_shunt_compartment, source, inh_delay, NO_REPS, interval) elif shunt_pos == 2: # proximal sim.set_Shunt(shunt_params, proximal_shunt_pos, 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, 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) 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) # 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) if syn_type == 'additive': if True: grec = h.Vector() grec.record(exnc[0]._ref_weight[1]) wrec = h.Vector() wrec.record(exnc[0]._ref_weight[3]) else: wrec = h.Vector() wrec.record(syn._ref_w) if pos == 3: carec = h.Vector() carec.record(cell.branches[0](0.1)._ref_cai) 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) if syn_type == 'additive': w = np.array(wrec) if pos ==3: car = np.array(carec) weight_change[i] = (w[-1]-w[0]) norm_factor = np.max(weight_change) print np.shape(norm_factor) plt.figure() ax = plt.subplot(111) ax.plot(delta_t_range,weight_change[:]/norm_factor) ax.spines['left'].set_position('zero') # turn off the right spine/ticks ax.spines['right'].set_color('none') ax.yaxis.tick_left() # set the y-spine ax.spines['bottom'].set_position('zero') # turn off the top spine/ticks ax.spines['top'].set_color('none') ax.xaxis.tick_bottom() plt.ylim(-1,1.1) plt.xlim(-20,20) plt.ylabel('$\Delta$ w') plt.xlabel('$\Delta$ t') plt.savefig('%s/weight_change.eps'%(savepath)) # delete del(cell) del(sim) del(syn) del(exstim) del(exnc) 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 if pos ==3: my_rawdata['ca'] = car if syn_type == 'additive': my_rawdata['w'] = w rawdata = {'raw_data': my_rawdata} return rawdata if __name__ == '__main__': rawdata = main()