////////////////////// /* net_dd_procs.hoc */ ////////////////////// /* -------------------------------------------------------------------------- */ /* -------------- NET BUILDING ---------------------------------------------- */ /* -------------------------------------------------------------------------- */ // __________________________ // Synapses - 1st Level // a) ii proc connect_random_II() {local i,j,pre,c,s,ct,tau // connect cells in a random fashion with the distribution given in lt_II c = 0 if (conmx == 1) { // Record the connectivity matrix: rows: presynaptic cells, columns: postsynaptic cells conmx_II = new Matrix(nIN,nIN) conmx_II.zero() } for i = 0, nIN - 1 { c=0 st=0 for j = -max_ddcon_II,max_ddcon_II { //if (abs(j) > 0) { // Make sure there are no autapses. if (rduni.repick() <= lt_II.x[abs(j)]) { pre=i+j while (pre<0) { pre=nIN+pre } while (pre>=nIN) { pre=pre-nIN } rnd1 = abs(rdnormII.repick()) while (rnd1 > max_ddcon_II) { rnd1 = abs(rdnormII.repick()) } rnd1 = int(rnd1) rnd2 = abs(rdnormII.repick()) while (rnd2 > max_ddcon_II) { rnd2 = abs(rdnormII.repick()) } rnd2 = int(rnd2) if (shuffled_II > 0) { s = SynG_II * negexp_II.x[abs(rnd1) - 1] if (shuffled_II > 1) { tau = abs(rnd2) } else { tau = abs(rnd1) } } else { s = SynG_II * negexp_II.x[abs(j) - 1] tau = abs(j) if (a_ddg_II == 0) { s = rdnorm.repick()*SynGcv_II*s+s } // The negexp_II-Vector assigns the value "1" to the 0th element which // coincides with the presynaptic IN. In order to assign the "1" to // the closest neighbouring IN, I have to subtract "1" from the index // of the negexp_II-Vector. if (s<0) { s=0 } } if (conmx == 1) { conmx_II.x[pre][i] = ind_gcomp(s,Syn_II_rise,tau) } interneuron[i].connect_pre_II(interneuron[pre],abs(j),s,tau) c += 1 st += s } } } printf("ii connections random pattern.\n") } // b) ie proc connect_random_IE() {local i,j,pre,c,s,ct,r // connect cells in a random fashion with the distribution given in lt_IE c = 0 if (conmx == 1) { // Record the connectivity matrix: rows: presynaptic cells, columns: postsynaptic cells conmx_IE = new Matrix(nIN,nPN) conmx_IE.zero() } for i = 0, nPN - 1 { c=0 st=0 for j = -max_ddcon_IE,max_ddcon_IE { if (rduni.repick() <=lt_IE.x[abs(j)]) { pre=int(i*nIN/nPN)+j while (pre<0) { pre=nIN+pre } while (pre>=nIN) { pre=pre-nIN } rnd1 = abs(rdnormIE.repick()) while (rnd1 > max_ddcon_II) { rnd1 = abs(rdnormIE.repick()) } rnd1 = int(rnd1) rnd2 = abs(rdnormIE.repick()) while (rnd2 > max_ddcon_II) { rnd2 = abs(rdnormIE.repick()) } rnd2 = int(rnd2) if (shuffled_IE > 0) { s = SynG_IE * negexp_IE.x[abs(rnd1) - 1] if (shuffled_IE > 1) { tau = abs(rnd2) } else { tau = abs(rnd1) } } else { s = SynG_IE * negexp_IE.x[abs(j) - 1] tau = abs(j) if (a_ddg_IE == 0) { s = rdnorm.repick()*SynGcv_IE*s+s } // The negexp_II-Vector assigns the value "1" to the 0th element which // coincides with the presynaptic IN. In order to assign the "1" to // the closest neighbouring IN, I have to subtract "1" from the index // of the negexp_II-Vector. if (s<0) { s=0 } } if (conmx == 1) { conmx_IE.x[pre][i] = ind_gcomp(s,Syn_IE_rise,tau) } principalneuron[i].connect_pre_IE(interneuron[pre],abs(j),s,tau) c += 1 st += s } } } printf("ie connections random pattern.\n") } // c) ei proc connect_random_EI() {local i,j,pre,c,s,ct // connect cells in a random and non-distance-dependent fashion c = 0 if (conmx == 1) { // Record the connectivity matrix: rows: presynaptic cells, columns: postsynaptic cells conmx_EI = new Matrix(nPN,nIN) conmx_EI.zero() } for i = 0, nIN - 1 { c=0 st=0 for j = -max_ddcon_EI,max_ddcon_EI { if (rduni.repick() <= lt_EI.x[abs(j)]) { pre=(i*nPN/nIN)+j while (pre<0) { pre=nPN+pre } while (pre>=nPN) { pre=pre-nPN } if (SynGcv_EI == 0) { s = SynG_EI } else { s = rdnorm.repick()*SynGcv_EI*SynG_EI+SynG_EI if (s<0) { s=0 } } if (conmx == 1) { conmx_EI.x[pre][i] = ind_gcomp(s,Syn_EI_rise,tau) } interneuron[i].connect_pre_EI(principalneuron[pre],abs(j),s) c += 1 st += s } } } printf("ei connections random pattern.\n") } // d) ee proc connect_random_EE() {local i,j,pre,c,s,ct // connect cells in a random and non-distance-dependent fashion c = 0 if (conmx == 1) { // Record the connectivity matrix: rows: presynaptic cells, columns: postsynaptic cells conmx_EE = new Matrix(nPN,nPN) conmx_EE.zero() } for i = 0, nPN - 1 { c=0 st=0 for j = -max_ddcon_EE,max_ddcon_EE { if (rduni.repick() <= lt_EE.x[abs(j)]) { pre=i+j while (pre<0) { pre=nPN+pre } while (pre>=nPN) { pre=pre-nPN } if (SynGcv_EE == 0) { s = SynG_EE } else { s = rdnorm.repick()*SynGcv_EE*SynG_EE+SynG_EE if (s<0) { s=0 } } if (conmx == 1) { conmx_EE.x[pre][i] = ind_gcomp(s,Syn_EE_rise,tau) } principalneuron[i].connect_pre_EE(principalneuron[pre],abs(j),s) c += 1 st += s } } } printf("ee connections random pattern.\n") } // _____________________________________________________________________________ // // __________________________ // Synapses - 2nd Level proc disconnect_net_II() {local i for i = 0,nIN-1 { interneuron[i].disconnect_cell_II() } msyn=0 } proc disconnect_net_IE() {local i for i = 0,nPN-1 { principalneuron[i].disconnect_cell_IE() } msyn=0 } proc disconnect_net_EI() {local i for i = 0,nIN-1 { interneuron[i].disconnect_cell_EI() } msyn=0 } proc disconnect_net_EE() {local i for i = 0,nPN-1 { principalneuron[i].disconnect_cell_EE() } msyn=0 } proc connect_net() { connect_random_II() connect_random_IE() connect_random_EI() } proc disconnect_net() { disconnect_net_II() disconnect_net_IE() disconnect_net_EI() } proc connect_pureff_net() { connect_random_II() connect_random_IE() } proc disconnect_pureff_net() { disconnect_net_II() disconnect_net_IE() } proc connect_recurrent_net() { connect_random_II() connect_random_IE() connect_random_EI() connect_random_EE() } proc disconnect_recurrent_net() { disconnect_net_II() disconnect_net_IE() disconnect_net_EI() disconnect_net_EE() } // _____________________________________________________________________________ // // __________________________ // Gaps proc connect_gaps() {local i,j,n,pre n = 0 for i=0,nIN-1 { for j=1,4 { pre=i+j if (pre>=nIN) { pre-=nIN } if (rdg.repick()) { interneuron[i].connect_gap(interneuron[pre]) interneuron[pre].connect_gap(interneuron[i]) n += 1 } } } gaps=2*n/nIN printf("Gaps inserted: %d \n",n) } proc disconnect_gaps() {local i for i = 0,nIN-1 { interneuron[i].disconnect_gaps() } gaps=0 } // _____________________________________________________________________________ // // __________________________________________ // Initiate constant excitatory drive proc initdrv_IN() { for i = 0,nIN-1 { if (tdrv2 == 0) { interneuron[i].drv_interneuron.del = 0 } else { // randomize onset of exc.drv interneuron[i].drv_interneuron.del = tdrv1 + rduni.repick()*(tdrv2-tdrv1) } if (Icv_interneuron == 0) { // random Iexc if Icv != 0 Cellvar_IN.x[i] = Imu_interneuron } else { Cellvar_IN.x[i] = rdnorm.repick()*Icv_interneuron*Imu_interneuron+Imu_interneuron } interneuron[i].change_Imu_interneuron(Cellvar_IN.x[i]) } } proc initdrv_PN() { for i = 0,nPN-1 { if (tdrv2 == 0) { principalneuron[i].drv_principalneuron.del = 0 } else { // randomize onset of exc.drv principalneuron[i].drv_principalneuron.del = tdrv1 + rduni.repick()*(tdrv2-tdrv1) } if (Icv_principalneuron == 0) { // random Iexc if Icv != 0 Cellvar_PN.x[i] = Imu_principalneuron } else { Cellvar_PN.x[i] = rdnorm.repick()*Icv_principalneuron*Imu_principalneuron+Imu_principalneuron } principalneuron[i].change_Imu_principalneuron(Cellvar_PN.x[i]) } } // _____________________________________________________________________________ // // __________________________________________ // Initiate background synaptic drive objref bgstim_IN[N_BGStim_IN], bgstim_PN[N_BGStim_PN] proc initbgdrive() { // Interneurons ------------------------------------------------------------ for i = 0,(N_BGStim_IN-1) { bgstim_IN[i] = new NetStim(0.5) bgstim_IN[i].interval = 1000/BGStim_f_IN bgstim_IN[i].number = BGStim_N_IN bgstim_IN[i].noise = BGStim_noise_IN bgstim_IN[i].start = tdrv1 + rduni.repick()*(tdrv2-tdrv1) } for j = 0,(nIN-1) { for k = 0,BGCon_N_IN-1 { if (BGCon_dd_IN > 0) { // a) Distance-dependent dist = int(rdnorm.repick*BGCon_SD_IN) while (dist>N_BGStim_IN/2) { dist = int(rdnorm.repick*BGCon_SD_IN) } groupsize = nIN/N_BGStim_IN central_NetStim = int(j/groupsize) input = central_NetStim + dist while (input>=N_BGStim_IN) { input = input-N_BGStim_IN } while (input<0) { input = N_BGStim_IN+input } } else { // b) random: spatially uncorrelated input //input = int(rduni.repick()*N_BGStim_IN) input = j } s = rdnorm.repick()*BGSyn_strength_cv_IN*BGSyn_strength_IN+BGSyn_strength_IN interneuron[j].bgdrive(bgstim_IN[input],s) } } // Principal neurons ------------------------------------------------------------ for i = 0,(N_BGStim_PN-1) { bgstim_PN[i] = new NetStim(0.5) bgstim_PN[i].interval = 1000/BGStim_f_PN bgstim_PN[i].number = BGStim_N_PN bgstim_PN[i].noise = BGStim_noise_PN bgstim_PN[i].start = tdrv1 + rduni.repick()*(tdrv2-tdrv1) } for j = 0,(nPN-1) { for k = 0,BGCon_N_PN-1 { if (BGCon_dd_PN > 0) { // a) Distance-dependent dist = int(rdnorm.repick*BGCon_SD_PN) while (dist>N_BGStim_PN/2) { dist = int(rdnorm.repick*BGCon_SD_PN) } groupsize = nPN/N_BGStim_PN central_NetStim = int(j/groupsize) input = central_NetStim + dist while (input>=N_BGStim_PN) { input = input-N_BGStim_PN } while (input<0) { input = N_BGStim_PN+input } } else { // b) random: spatially uncorrelated input //input = int(rduni.repick()*N_BGStim_PN) input = j } s = rdnorm.repick()*BGSyn_strength_cv_PN*BGSyn_strength_PN+BGSyn_strength_PN principalneuron[j].bgdrive(bgstim_PN[input],s) } } } // _____________________________________________________________________________ // // __________________________________________ // Initiate shaped input proc init_INinj_input() { local i,c temshape_INinput() spashape_INinput() for i = 0,nIN-1 { // introduce some variability in the onset of the input injection: z = int(rduni.repick()*tvarINinj)+tINinj_on interneuron[i].inj_input(spaiinj_IN.x[i],z) } if (spaiinj_IN.max() > 1) { printf("Interneuron input vector exceeds 1. Maximal value: %f\n",spaiinj_IN.max()) } } proc init_PNinj_input() { local i,c temshape_PNinput() spashape_PNinput() for i = 0,nPN-1 { // introduce some variability in the onset of the input injection: z = int(rduni.repick()*tvarPNinj)+tPNinj_on principalneuron[i].inj_input(spaiinj_PN.x[i],z) } if (spaiinj_PN.max() > 1) { printf("Principalneuron input vector exceeds 1. Maximal value: %f\n",spaiinj_PN.max()) } } objref IN_signstim[IN_N_SIGNStim] proc init_INsyn_input() { local i,half,j,k,input spashape_INinput() for i = 0,(IN_N_SIGNStim-1) { IN_signstim[i] = new NetStim(0.5) IN_signstim[i].interval = 1000/(IN_SIGNStim_f*spaiinj_IN.x[i]) IN_signstim[i].number = IN_SIGNStim_N*spaiinj_IN.x[i] IN_signstim[i].noise = IN_SIGNStim_noise IN_signstim[i].start = tINinj_on + rduni.repick()*tvarINinj } half = (IN_SIGNCon_N-1)/2 for j = 0,(nIN-1) { for k = 0,IN_SIGNCon_N-1 { dist = k-half // Distance between the cell and the Stimulator. input = int(j+dist) s = IN_SIGNSyn_strength interneuron[j].signinput(IN_signstim[input],s) } } } objref PN_signstim[PN_N_SIGNStim] proc init_PNsyn_input() { local i,half,j,k,input spashape_PNinput() for i = 0,(PN_N_SIGNStim-1) { PN_signstim[i] = new NetStim(0.5) PN_signstim[i].interval = 1000/(PN_SIGNStim_f*spaiinj_PN.x[i]) PN_signstim[i].number = PN_SIGNStim_N*spaiinj_PN.x[i] PN_signstim[i].noise = PN_SIGNStim_noise PN_signstim[i].start = tPNinj_on + rduni.repick()*tvarPNinj } half = (PN_SIGNCon_N-1)/2 for j = 0,(nPN-1) { for k = 0,PN_SIGNCon_N-1 { dist = k-half // Distance between the cell and the Stimulator. input = int(j+dist) s = PN_SIGNSyn_strength principalneuron[j].signinput(PN_signstim[input],s) } } } proc initINinput() { if (IN_input_format < 2) { init_INinj_input() } else { init_INsyn_input() } } proc initPNinput() { if (PN_input_format < 2) { init_PNinj_input() } else { init_PNsyn_input() } } // _____________________________________________________________________________ //