; Izhikevich neuron model, modified from IF4 ; 3/12/09: added GABA decay time constant keyword (gabad) ; 4/6/09: changed back from Izh version ; 4/7/09: changed "gabad" keyword to "decay_gaba" (conflict with "gaba") ; 4/18/09: added "con_i_all" keyword (passed to init_net.pro) pro ctx, str, rseed=rseed, ampa_scl=ampa_scl, nmda_e=nmda_e, nmda_rs=nmda_rs, nmda_fs=nmda_fs, gaba=gaba, $ con_t=con_t, con_p=con_p, con_r=con_r, con_if=con_if, con_ir=con_ir, con_i_all=con_i_all, $ i_del=i_del, noise_wt=noise_wt, W_scl=W_scl, decay_gaba=decay_gaba common path, home_path, single_path, avg_path, ps_path, latadj_path, dv_path, pca_path, bhv_path, $ image_path, ers_path, ica_path common params, n_ids common net_params, N_all, N_e, N_ir, N_if, dt, inv_dt, update, t_init, t_pre, t_stim, t_post, t_all common vars, W, W_noise common rand, seed ; Get seed for random number generator if keyword_set(rseed) then begin if (size(rseed,/type) EQ 7) then begin seed=rseed seed = lonarr(36) openr, fu, single_path + rseed + '_rand.dat', /get_lun readu, fu, seed & free_lun, fu endif else seed=long(rseed) endif else dum=randomu(seed,1) openw, fu, single_path + str + '_rand.dat', /get_lun writeu, fu, seed & free_lun, fu if not(keyword_set(ampa_scl)) then ampa_scl=1. $ else print, 'ctx: ampa=', ampa_scl if not(keyword_set(nmda_e)) then nmda_e=0. $ else print, 'ctx: nmda_e=', nmda_e if not(keyword_set(nmda_rs)) then nmda_rs=0. $ else print, 'ctx: nmda_rs=', nmda_rs if not(keyword_set(nmda_fs)) then nmda_fs=0. $ else print, 'ctx: nmda_fs=', nmda_fs nmda_scl = $ [fltarr(N_e)+(0.45*(1. - nmda_e)), fltarr(N_ir)+(0.1*(1. - nmda_rs)), fltarr(N_if)+(0.1*(1. - nmda_fs))] if not(keyword_set(gaba)) then gaba=0 if not(keyword_set(con_t)) then con_t=0 if not(keyword_set(con_p)) then con_p=0 if not(keyword_set(con_r)) then con_r=0 if not(keyword_set(con_if)) then con_if=0 if not(keyword_set(con_ir)) then con_ir=0 if not(keyword_set(con_i_all)) then con_i_all=0 if not(keyword_set(i_del)) then i_del=0 if not(keyword_set(noise_wt)) then noise_wt=0 if not(keyword_set(W_scl)) then W_scl=0 if not(keyword_set(decay_gaba)) then decay_gaba=5. spikes = fltarr(N_all,inv_dt) current_spike = inv_dt-1 v = dblarr(N_all) temp = intarr(N_all) noise = fltarr(N_all,update) g_r_ampa=fltarr(N_all) & g_r_nmda=fltarr(N_all) & g_r_gaba=fltarr(N_all) g_d_ampa=fltarr(N_all) & g_d_nmda=fltarr(N_all) & g_d_gaba=fltarr(N_all) g_ampa=0. & g_nmda=0. & g_gaba=0. inv_tau_r_ampa=-dt/.5 & inv_tau_r_nmda=-dt/2. & inv_tau_r_gaba=-dt/.5 ;inv_tau_d_ampa=-dt/2. & inv_tau_d_nmda=-dt/100. & inv_tau_d_gaba=-dt/5. inv_tau_d_ampa=-dt/2. & inv_tau_d_nmda=-dt/100. & inv_tau_d_gaba=-dt/decay_gaba norm_ampa=.472689 & norm_nmda=.904821 & norm_gaba=.697016 inv_tau_mem=-1./[fltarr(N_e)+20.,fltarr(N_ir)+20.,fltarr(N_if)+10.] ; used in non-Izh version ;thresh = [fltarr(N_e)-52.,fltarr(N_ir)-55.,fltarr(N_if)-52.] ; non-Izh thresh = [fltarr(N_e)-52.,fltarr(N_ir)-52.,fltarr(N_if)-52.] ; non-Izh ;thresh = [fltarr(N_e)+30.,fltarr(N_ir)+30.,fltarr(N_if)+30.] ; Izh init_net, str, gaba=gaba, con_t=con_t, con_p=con_p, con_r=con_r, con_if=con_if, con_ir=con_ir, con_i_all=con_i_all, $ i_del=i_del, noise_wt=noise_wt, W_scl=W_scl noise_gen, str openw, spike_fu, single_path + str + '_spk.dat', /get_lun openw, Vm_fu, single_path + str + '_Vm.dat', /get_lun openr, noise_fu, single_path + str + '_noise.dat', /get_lun ;spikes[*,*]=0 & v[*]=double(-65.) & g_ampa[*]=0. & g_nmda[*]=0. & g_gaba[*]=0. ; Izh spikes[*,*]=0 & v[*]=double(-70.) & g_ampa[*]=0. & g_nmda[*]=0. & g_gaba[*]=0. ; non-Izh ;; Izh parameters ;a = [0.02 + fltarr(N_e), 0.02 + fltarr(N_ir), 0.1 + fltarr(N_if)] ;b = [0.2 + fltarr(N_e), 0.25 + fltarr(N_ir), 0.2 + fltarr(N_if)] ;c = [-65. + fltarr(N_e), -65. + fltarr(N_ir), -65. + fltarr(N_if)] ;d = [8. + fltarr(N_e), 2. + fltarr(N_ir), 2. + fltarr(N_if)] ;u = b * v for t=long(0),t_all-1 do begin fired = where(v GE thresh, count) if (count GT 0) then begin v[fired] = double(-59.) ; non-Izh ;v[fired] = c[fired] ; Izh ;u[fired] += d[fired] ; Izh spikes[fired,current_spike] = 1. endif if ((t mod update) EQ 0) then begin readu, noise_fu, temp noise[*,0] = temp writeu, spike_fu, fix(total(spikes[*,*],2) GT 0) writeu, Vm_fu, v endif glu_act = (W > 0.)#spikes[*,0] + W_noise*noise[*,t mod update] g_r_ampa += inv_tau_r_ampa*g_r_ampa + glu_act g_d_ampa += inv_tau_d_ampa*g_d_ampa + glu_act g_ampa = (g_d_ampa - g_r_ampa)/norm_ampa g_r_nmda += inv_tau_r_nmda*g_r_nmda + glu_act g_d_nmda += inv_tau_d_nmda*g_d_nmda + glu_act g_nmda = (g_d_nmda - g_r_nmda)/norm_nmda g_r_gaba += inv_tau_r_gaba*g_r_gaba - (W < 0.)#spikes[*,0] g_d_gaba += inv_tau_d_gaba*g_d_gaba - (W < 0.)#spikes[*,0] g_gaba = (g_d_gaba - g_r_gaba)/norm_gaba I_syn = -(ampa_scl*g_ampa*v + nmda_scl*g_nmda*v/(1. + exp(-0.062*v)/3.57) + g_gaba*(v+70.)) v += dt*(inv_tau_mem*(v + 70.) + I_syn) ; non-Izh ;v += dt*(0.04 * v^2 + 5.*v + 140. - u + I_syn) ;u += dt*(a * ((b * v) - u)) spikes=shift(spikes,0,-1) & spikes[*,current_spike]=0. end ; t free_lun, spike_fu, Vm_fu, noise_fu if (total(finite(v)) NE N_all) then print, 'error: v=NaN' print, 'ctx: ', str, ' done' return end