//////////////////////// /* net_dd_vectors.hoc */ //////////////////////// objref lt_II, lt_IE, lt_EI, lt_EE, negexp_II, negexp_IE, tauvec_II, tauvec_IE, weight, tausum weight = new Vector(nIN/2) tausum = new Vector(nIN/2) // ______________________________ // Auxiliary vectors for Synapses // ------ II connections ------------------------------------------------------- // 1. Distance dependence in the network connectivity lt_II = new Vector(nIN+1) // Storing the connection probability in dependence lt_II_scale = Msyn_II / erf (max_ddcon_II / (sd_ddcon_II * sqrt(2))) // scaling factor for the gaussian distribution of the connectivity rates // to achieve the correct connectivity rates Msyn_II ultimately. for i=0,max_ddcon_II { lt_II.x[i]=(lt_II_scale/(sqrt(2*PI)*sd_ddcon_II)) * exp(-(i*i)/(2*sd_ddcon_II*sd_ddcon_II)) } // gaussian distribution of conn. prob. centered around the cell with sd_ddcon_IE, // maximal distance of max_ddcon_II. The vector is automatically adjusted to a new Msyn_II value. // !!! Attention!!! If Msyn_II becomes too high, then the the scaling factor lt_II_scale becomes too // large and the connection probability for close presynaptic cells is larger than 1 // --> will result in a lower connectivity than wanted! To compensate for this either max_ddcon_II can // be enlarged or ddcon_II_sd! // 2. Distance dependence in the synaptic conductances negexp_II = new Vector(nIN/2) // Storing a multiplicative factor for the synaptic strengths over distance. for i=0,((nIN/2)-1) { z = exp(-(a_ddg_II*SynADel)*i) if (z >= ddg_II_low) { negexp_II.x[i] = z } else { negexp_II.x[i] = ddg_II_low } } // 3. Distance dependence in the decay time constants func tau_II_average() { // $1 is the Syn_II_decay_0 of interest weight.fill(0) tausum.fill(0) for i = 0,max_ddcon_II-1 { weight.x[i] = negexp_II.x[i]*lt_II.x[i] } weight = weight.div(weight.sum()) for i = 0,max_ddcon_II-1 { syn_ID = int((i*Syn_II_N)/max_ddcon_II) z = $1 + (syn_ID*b_ddtau_II*SynADel*(max_ddcon_II/Syn_II_N)) if (z <= Syn_II_decay_top) { tausum.x[i] = z } else { tausum.x[i] = Syn_II_decay_top } } tausum = tausum.mul(weight) return tausum.sum() } proc tau_II_level() { tau1 = tau_II_average(1) tau2 = tau_II_average(2) Syn_II_decay_0 = 2 - (((2-1)*(tau2-Syn_II_decay_standard))/(tau2-tau1)) if (Syn_II_decay_0 < Syn_II_decay_bottom) { printf("Warning: Syn_II_decay could not be levelled! Instead of %f, Syn_II_decay_0 will be set to the default value %f\n",Syn_II_decay_0,Syn_II_decay_bottom) Syn_II_decay_0 = Syn_II_decay_bottom } } tau_II_level() tauvec_II = new Vector(nIN/2) // Storing a certain ratio between fast and slow component of the inhibitory synapse. tauvec_II.fill(Syn_II_decay_top) for i=0,max_ddcon_II-1 { syn_ID = int((i*Syn_II_N)/max_ddcon_II) z = Syn_II_decay_0 + (b_ddtau_II*SynADel*(max_ddcon_II/Syn_II_N)*syn_ID) if (z <= Syn_II_decay_top) { tauvec_II.x[i] = z } else { tauvec_II.x[i] = Syn_II_decay_top } } // ------ IE connections ------------------------------------------------------- // 1. Distance dependence in the network connectivity lt_IE = new Vector(nIN+1) // Storing the connection probability in dependence lt_IE_scale = Msyn_IE / erf (max_ddcon_IE / (sd_ddcon_IE * sqrt(2))) for i=0,max_ddcon_IE { lt_IE.x[i]=(lt_IE_scale/(sqrt(2*PI)*sd_ddcon_IE)) * exp(-(i*i)/(2*sd_ddcon_IE*sd_ddcon_IE)) } // 2. Distance dependence in the synaptic conductances negexp_IE = new Vector(nIN/2) // Storing a multiplicative factor for the synaptic strengths over distance. for i=0,((nIN/2)-1) { z = exp(-(a_ddg_IE*SynADel)*i) if (z >= ddg_IE_low) { negexp_IE.x[i] = z } else { negexp_IE.x[i] = ddg_IE_low } } // 3. Distance dependence in the decay time constants func tau_IE_average() { // $1 is the Syn_IE_decay_0 of interest weight.fill(0) tausum.fill(0) for i = 0,max_ddcon_IE-1 { weight.x[i] = negexp_IE.x[i]*lt_IE.x[i] } weight = weight.div(weight.sum()) for i = 0,max_ddcon_IE-1 { syn_ID = int((i*Syn_IE_N)/max_ddcon_IE) z = $1 + (syn_ID*b_ddtau_IE*SynADel*(max_ddcon_IE/Syn_IE_N)) if (z <= Syn_IE_decay_top) { tausum.x[i] = z } else { tausum.x[i] = Syn_IE_decay_top } } tausum = tausum.mul(weight) return tausum.sum() } proc tau_IE_level() { tau1 = tau_IE_average(1) tau2 = tau_IE_average(2) Syn_IE_decay_0 = 2 - (((2-1)*(tau2-Syn_IE_decay_standard))/(tau2-tau1)) if (Syn_IE_decay_0 < Syn_IE_decay_bottom) { printf("Warning: Syn_IE_decay could not be levelled! Instead of %f, Syn_IE_decay_0 will be set to the default value %f\n",Syn_IE_decay_0,Syn_IE_decay_bottom) Syn_IE_decay_0 = Syn_IE_decay_bottom } } tau_IE_level() tauvec_IE = new Vector(nIN/2) // Storing a certain ratio between fast and slow component of the inhibitory synapse. tauvec_IE.fill(Syn_IE_decay_top) for i=0,max_ddcon_IE-1 { syn_ID = int((i*Syn_IE_N)/max_ddcon_IE) z = Syn_IE_decay_0 + (b_ddtau_IE*SynADel*(max_ddcon_IE/Syn_IE_N)*syn_ID) if (z <= Syn_IE_decay_top) { tauvec_IE.x[i] = z } else { tauvec_IE.x[i] = Syn_IE_decay_top } } // ------ EI connections ------------------------------------------------------- lt_EI = new Vector(nPN+1) lt_EI_scale = Msyn_EI / erf (max_ddcon_EI / (sd_ddcon_EI * sqrt(2))) for i=0,max_ddcon_EI { lt_EI.x[i]=(lt_EI_scale/(sqrt(2*PI)*sd_ddcon_EI)) * exp(-(i*i)/(2*sd_ddcon_EI*sd_ddcon_EI)) } // ------ EE connections ------------------------------------------------------- lt_EE = new Vector(nPN+1) lt_EE_scale = Msyn_EE / erf (max_ddcon_EE / (sd_ddcon_EE * sqrt(2))) for i=0,max_ddcon_EE { lt_EE.x[i]=(lt_EE_scale/(sqrt(2*PI)*sd_ddcon_EE)) * exp(-(i*i)/(2*sd_ddcon_EE*sd_ddcon_EE)) } // _____________________________________________________________________________ // // _____________________________________________________________________________ // Calculation of the maximal conductance for the different DD modes based on // the compound conductance of the noDD mode! func compound_conductance_II() { local compcond,i,j,g,x // $1 considering DD-vectors (1) or not for noDD-standard (0) // $2 gmax compcond = 0 if ($1 == 0) { for i = 0,max_ddcon_II-1 { g = $2 x = lt_II.x[i] ind_compcond = 0 for j = 0,(100/dt)-1 { ind_compcond = ind_compcond+(g*(exp(-(j*dt)/Syn_II_decay_standard)-exp(-(j*dt)/Syn_II_rise))) } compcond = compcond + (x*ind_compcond) } } else { for i = 0,max_ddcon_II-1 { g = $2*negexp_II.x[i] x = lt_II.x[i] ind_compcond = 0 for j = 0,(100/dt)-1 { ind_compcond = ind_compcond+(g*(exp(-(j*dt)/tauvec_II.x[i])-exp(-(j*dt)/Syn_II_rise))) } compcond = compcond + (x*ind_compcond) } } return compcond } func compound_conductance_IE() { local compcond,i,j,g,x // $1 considering DD-vectors (1) or not for noDD-standard (0) // $2 gmax compcond = 0 if ($1 == 0) { for i = 0,max_ddcon_IE-1 { g = $2 x = lt_IE.x[i] ind_compcond = 0 for j = 0,(100/dt)-1 { ind_compcond = ind_compcond+(g*(exp(-(j*dt)/Syn_IE_decay_standard)-exp(-(j*dt)/Syn_IE_rise))) } compcond = compcond + (x*ind_compcond) } } else { for i = 0,max_ddcon_IE-1 { g = $2*negexp_IE.x[i] x = lt_IE.x[i] ind_compcond = 0 for j = 0,(100/dt)-1 { ind_compcond = ind_compcond+(g*(exp(-(j*dt)/tauvec_IE.x[i])-exp(-(j*dt)/Syn_IE_rise))) } compcond = compcond + (x*ind_compcond) } } return compcond } proc g_level() { g_std = compound_conductance_II(0,g_standard_II) g_lin1 = compound_conductance_II(1,0.05) g_lin2 = compound_conductance_II(1,0.1) SynG_II = 0.05+((0.1-0.05)*(g_std-g_lin1)/(g_lin2-g_lin1)) g_std = compound_conductance_IE(0,g_standard_IE) g_lin1 = compound_conductance_IE(1,0.05) g_lin2 = compound_conductance_IE(1,0.1) SynG_IE = 0.05+((0.1-0.05)*(g_std-g_lin1)/(g_lin2-g_lin1)) } // ______________________________________ // Auxiliary vectors for the shaped input objref temvecIN_plt, temvecPN_plt, spavecIN_plt, spavecPN_plt iinj_time = new Vector(tstop/inj_step) // Interneurons ---------------------------------------------------------------- proc temshape_INinput() { local i,j,k temiinj_IN = new Vector(tstop/inj_step) for i = 0,((tINinj_on/inj_step)-1) { temiinj_IN.x[i] = 0 } for j = (tINinj_on/inj_step),((tINinj_off/inj_step)-1) { temiinj_IN.x[j] = INinj_amp } for k = (tINinj_off/inj_step),((tstop/inj_step)-1) { temiinj_IN.x[k] = 0 } iinj_time.indgen(0,tstop,inj_step) if (plotting == 1) { temvecIN_plt = new Graph() temvecIN_plt.size(0,tstop,0,1) temvecIN_plt.label(0.05,0.95,"amp") temvecIN_plt.label(0.95,0.05,"ms") temvecIN_plt.color(2) temvecIN_plt.label(0.95,0.95,"IN") temiinj_IN.plot(temvecIN_plt,4,2) } } proc spashape_INinput() { local i,d,d1,d2 spaiinj_IN = new Vector(nIN) // Squared inputs spaiinj_IN.fill(0.000000000001) // Der erste input for i = (spainjIN_M1-int(spainjIN_sd1/2)),(spainjIN_M1+int(spainjIN_sd1/2)) { spaiinj_IN.x[i] = 1 } // Der zweite input //for i = (spainjIN_M2-int(spainjIN_sd2/2)),(spainjIN_M2+int(spainjIN_sd2/2)) { spaiinj_IN.x[i] = spainjIN_ratio } /* // Gaussian (SD = spainjIN_sd1 and mean = spainjIN_M1) for i = 0,(nIN-1) { d = abs(i-spainjIN_M1) // Distance from cell position to Gaussian-Mean. if (d > nIN/2) { d = nIN-d } spaiinj_IN.x[i] = exp(-0.5*(d/spainjIN_sd1)*(d/spainjIN_sd1)) } */ /* // 2 Gaussians (SD = spainjIN_sd1 and mean = spainjIN_M1 bzw. sd2 and M2) for i = 0,(nIN-1) { d1 = abs(i-spainjIN_M1) if (d1 > nIN/2) { d1 = nIN-d1 } d2 = abs(i-spainjIN_M2) if (d2 > nIN/2) { d2 = nIN-d2 } spaiinj_IN.x[i] = (exp(-0.5*(d1/spainjIN_sd1)*(d1/spainjIN_sd1))) + spainjIN_ratio*(exp(-0.5*(d2/spainjIN_sd2)*(d2/spainjIN_sd2))) } */ if (plotting == 1) { spavecIN_plt = new Graph() spavecIN_plt.size(0,nIN,0,1) spavecIN_plt.label(0.05,0.95,"rel. amp") spavecIN_plt.label(0.95,0.05,"ind(IN)") spaiinj_IN.plot(spavecIN_plt,2,2) } } // Principal neurons ---------------------------------------------------------------- proc temshape_PNinput() { local i,j,k temiinj_PN = new Vector(tstop/inj_step) for i = 0,((tPNinj_on/inj_step)-1) { temiinj_PN.x[i] = 0 } for j = (tPNinj_on/inj_step),((tPNinj_off/inj_step)-1) { temiinj_PN.x[j] = PNinj_amp } for k = (tPNinj_off/inj_step),((tstop/inj_step)-1) { temiinj_PN.x[k] = 0 } iinj_time.indgen(0,tstop,inj_step) if (plotting == 1) { temvecPN_plt = new Graph() temvecPN_plt.size(0,tstop,0,1) temvecPN_plt.label(0.05,0.95,"amp") temvecPN_plt.label(0.95,0.05,"ms") temvecPN_plt.color(2) temvecPN_plt.label(0.95,0.95,"PN") temiinj_PN.plot(temvecPN_plt,4,2) } } proc spashape_PNinput() { local i,d,d1,d2 spaiinj_PN = new Vector(nPN) // Squared inputs spaiinj_PN.fill(0.000000000001) // Der erste input for i = (spainjPN_M1*(nPN/nIN)-int(spainjPN_sd1*(nPN/nIN)/2)),(spainjPN_M1*(nPN/nIN)+int(spainjPN_sd1*(nPN/nIN)/2)) { spaiinj_PN.x[i] = 1 } // Der zweite input //for i = (spainjPN_M2*(nPN/nIN)-int(spainjPN_sd2*(nPN/nIN)/2)),(spainjPN_M2*(nPN/nIN)+int(spainjPN_sd2*(nPN/nIN)/2)) { spaiinj_PN.x[i] = spainjPN_ratio } /* // Gaussian (SD = spainjPN_sd1*(nPN/nIN) and mean = spainjPN_M1*(nPN/nIN)) for i = 0,(nPN-1) { d = abs(i-spainjPN_M1*(nPN/nIN)) // Distance from cell position to Gaussian-Mean. if (d > nPN/2) { d = nPN-d } spaiinj_PN.x[i] = exp(-0.5*(d/(spainjPN_sd1*(nPN/nIN)))*(d/(spainjPN_sd1*(nPN/nIN)))) } */ /* // 2 Gaussians (SD = spainjPN_sd1*(nPN/nIN) and mean = spainjPN_M1*(nPN/nIN) bzw. sd2 and M2) for i = 0,(nPN-1) { d1 = abs(i-spainjPN_M1*(nPN/nIN)) if (d1 > nPN/2) { d1 = nPN-d1 } d2 = abs(i-spainjPN_M2*(nPN/nIN)) if (d2 > nPN/2) { d2 = nPN-d2 } spaiinj_PN.x[i] = (exp(-0.5*(d1/(spainjPN_sd1*(nPN/nIN)))*(d1/(spainjPN_sd1*(nPN/nIN))))) + spainjPN_ratio*(exp(-0.5*(d2/(spainjPN_sd2*(nPN/nIN)))*(d2/(spainjPN_sd2*(nPN/nIN))))) } */ if (plotting == 1) { spavecPN_plt = new Graph() spavecPN_plt.size(0,nPN,0,1) spavecPN_plt.label(0.05,0.95,"rel. amp") spavecPN_plt.label(0.95,0.05,"ind(PN)") spaiinj_PN.plot(spavecPN_plt,2,2) } } // _____________________________________________________________________________ //