Distance-dependent inhibition in the hippocampus (Strüber et al. 2017)

 Download zip file 
Help downloading and running models
Accession:229750
Network model of a hippocampal circuit including interneurons and principal cells. Amplitude and decay time course of inhibitory synapses can be systematically changed for different distances between connected cells. Various forms of excitatory drives can be administered to the network including spatially structured input.
Reference:
1 . Strüber M, Sauer JF, Jonas P, Bartos M (2017) Distance-dependent inhibition facilitates focality of gamma oscillations in the dentate gyrus. Nat Commun 8:758 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism: Dentate gyrus;
Cell Type(s): Dentate gyrus granule GLU cell; Dentate gyrus basket cell;
Channel(s):
Gap Junctions: Gap junctions;
Receptor(s): GabaA; Glutamate;
Gene(s):
Transmitter(s): Gaba; Glutamate;
Simulation Environment: NEURON;
Model Concept(s): Gamma oscillations; Spatio-temporal Activity Patterns;
Implementer(s): Strüber, Michael [michael_strueber at hotmail.com];
Search NeuronDB for information about:  Dentate gyrus granule GLU cell; GabaA; Glutamate; Gaba; Glutamate;
/
DDnet
readme.txt
gap.mod
kaprox.mod *
kdrca1.mod *
km.mod *
na3n.mod *
net_hh_wbsh.mod
net_dd_ana.hoc
net_dd_emodel.hoc
net_dd_imodel.hoc
net_dd_params.hoc
net_dd_procs.hoc
net_dd_run.hoc
net_dd_vectors.hoc
                            
///////////////////////
/* net_dd_emodel.hoc */
///////////////////////

objref principalneuron[nPN]			// the "network" of Principal Cells (n = nPN)

begintemplate Principalneuron			// template of a Principal Cell

public  soma_principalneuron, old_v, drv_principalneuron, syn_IE, \
			switch_syn_IE, set_syn, change_Imu_principalneuron, \
			pre_list_IE, connect_pre_IE, is_connected_IE,\
			disconnect_cell_IE, syn_EE, pre_list_EE, connect_pre_EE, disconnect_cell_EE,\
      is_connected_EE, currents, index_PN, switch_syn_EE, indicing_PN,\
      bgdrive, inj_input, injvec, signinput

external n_d_principalneuron,n_L_principalneuron,n_seg_principalneuron,Ek_principalneuron,\
			 ARes_principalneuron,MCap_principalneuron,Rm_principalneuron, Vrest_principalneuron,\
       gna_principalneuron, shift_principalneuron, ena_principalneuron, gkdr_principalneuron,\
       gka_principalneuron, gkm_principalneuron,\
       Syn_IE_rise, SynE_IE, SynDel, SynADel, Imu_principalneuron, tstop,\
			 Syn_EE_rise, Syn_EE_decay, SynE_EE, Ek_principalneuron, tauvec_IE, Syn_IE_N,\
			 temiinj_PN, iinj_time, inj_step, BGSyn_rise_PN, BGSyn_decay_PN, max_ddcon_IE, nPN,\
       tPNinj_on, PN_SIGNSyn_rise, PN_SIGNSyn_decay 
			 
objref syn_IE[50], pre_list_IE, syn_EE, pre_list_EE, injvec,\
	     drv_principalneuron, net_c_interneuron, net_c_principalneuron, bgsyn, bgdrive_list, inj_PN,\
	     signinput_list, signsyn

create soma_principalneuron

proc init() {
   pre_list_IE = new List()
   pre_list_EE = new List()
   bgdrive_list = new List()
   signinput_list = new List()
   
   soma_principalneuron { 
		    //geometry
		    diam = n_d_principalneuron  L=n_L_principalneuron nseg=n_seg_principalneuron 
		    f_surf = area(0.5)/100000
		
		    //cable params
		    Ra = ARes_principalneuron cm=MCap_principalneuron v=Vrest_principalneuron 
		    old_v = Vrest_principalneuron
		
        //membrane mechanisms
        insert pas 
            e_pas=Vrest_principalneuron 
            g_pas=1/Rm_principalneuron 
                       
        insert na3
            gbar_na3 = gna_principalneuron
            sh_na3 = shift_principalneuron
            ena = ena_principalneuron
        insert kdr
            gkdrbar_kdr = gkdr_principalneuron
            sh_kdr = shift_principalneuron
            ek = Ek_principalneuron
        insert kap
            gkabar_kap = gka_principalneuron
            sh_kap = shift_principalneuron
        insert km
            gbar_km = gkm_principalneuron
            sh_km=shift_principalneuron
        
        // postsynaptic IPSCs
		    for i = 0,Syn_IE_N-1 {
            syn_IE[i] = new Exp2Syn(0.5)
            syn_IE[i].tau1 = Syn_IE_rise
            syn_IE[i].tau2 = tauvec_IE.x[i*(max_ddcon_IE/Syn_IE_N)]
            syn_IE[i].e = SynE_IE
        }
		    
		    // postsynaptic EPSCs
		    syn_EE = new Exp2Syn(0.5)		
		
		    syn_EE.tau1 = Syn_EE_rise
		    syn_EE.tau2 = Syn_EE_decay
		    syn_EE.e = SynE_EE
		    
		    // excitatory synapses for background drive
        bgsyn = new Exp2Syn(0.5)
        bgsyn.tau1 = BGSyn_rise_PN
        bgsyn.tau2 = BGSyn_decay_PN
        bgsyn.e = 0
        
        // excitatory synapses for synaptic input signal
        signsyn = new Exp2Syn(0.5)
        signsyn.tau1 = PN_SIGNSyn_rise
        signsyn.tau2 = PN_SIGNSyn_decay
        signsyn.e = 0

		    // IClamps - a) constant drive
		    drv_principalneuron = new IClamp(0.5)

		    drv_principalneuron.del = 0
		    drv_principalneuron.dur = tstop
		    drv_principalneuron.amp = Imu_principalneuron*f_surf	// nA
		    // excitatory curent injection - the density param. 'Imu' [uA/cm^2] should be converted 
		    // to the injected current 'amp' [nA] using the factor 'fsurf' derived from the 
		    // surface area [um^2] and the conversion of the units
		    
		    // IClamps - b) for shaped input
		    inj_PN = new IClamp(0.5)

		    inj_PN.del = 0
		    inj_PN.dur = tstop
	  }
}   

proc indicing_PN() {
  index_PN = $1
}

// ****IPSCs****
proc connect_pre_IE() {local f, axdel, strength
// $o1 arg is the **PRESynaptic** Cell, $2 is the distance between the cells, $3 gsyn, $4 distance for the tau-Vector
   axdel=$2*SynADel       // in ms distance between cells 50 um
                       	  // AP propagation  .25 m/s => 0.2 ms for one interval
   strength = $3*f_surf	  // synaptic strength calculate using the surface factor
   synno = int(($4*Syn_IE_N)/(max_ddcon_IE+1))   			   

   $o1.soma_interneuron pre_list_IE.append( new NetCon(&v(1),syn_IE[synno],-20,SynDel+axdel,strength))
  // list.append() adds new items to the list
	// NetCon: (presynaptic variable, target, thresh, delay, weight)
	// the last argument is the 'weight' with a range of [0-1] where 1 corresponds to 1 æS peak 
	// conversion: 'SynG' [mS/cm^2] to 'weight' [uS] using the factor 'fsurf' derived from the 
	// surface area [um^2] and the conversion of the units
}

proc disconnect_cell_IE() {
   pre_list_IE.remove_all()
}

func is_connected_IE() {local i,c			// check if connected
   c = 0
   for i = 0,pre_list_IE.count()-1 {
		net_c_interneuron = pre_list_IE.object(i)		// get netCon object from list
		if ($o1 == net_c_interneuron.precell()) {c=1}
   }
   return c
}   

proc switch_syn_IE() {local i			// check if connected
   for i = 0,Syn_IE_N-1 {
      syn_IE[i].tau1 = Syn_IE_rise			// to make sure changes in syn params 
      syn_IE[i].tau2 = tauvec_IE.x[i*(max_ddcon_IE/Syn_IE_N)]
      syn_IE[i].e = SynE_IE
   }
   
   for i = 0,pre_list_IE.count()-1 {
	    net_c_interneuron = pre_list_IE.object(i)		// get netCon object from list
	    net_c_interneuron.active($1)
	 }
}


// ****EPSCs****
proc connect_pre_EE() {local f, axdel, strength
  // $o1 arg is the **PRSynEaptic** Cell, $2 is the distance between the cells, $3 gsyn
   axdel=$2*SynADel       // AP propagation  .25 m/s => 0.2 ms for one interval
   strength = $3*f_surf	  // synaptic strength calculate using the surface factor			   
   $o1.soma_principalneuron pre_list_EE.append( new NetCon(&v(1),syn_EE,-20,SynDel+axdel,strength))
   // list.append() adds new items to the list
	// NetCon: (presynaptic variable, target, thresh, delay, weight)
	// the last argument is the 'weight' with a range of [0-1] where 1 corresponds to 1 æS peak 
	// conversion: 'SynG' [mS/cm^2] to 'weight' [uS] using the factor 'fsurf' derived from the 
	// surface area [um^2] and the conversion of the units
}

proc disconnect_cell_EE() {
   pre_list_EE.remove_all()
}

func is_connected_EE() {local i,c			// check if connected
   c = 0
   for i = 0,pre_list_EE.count()-1 {
		net_c_principalneuron = pre_list_EE.object(i)		// get netCon object from list
		if ($o1 == net_c_principalneuron.precell()) {c=1}
   }
   return c
}   

proc switch_syn_EE() {local i			// check if connected
   syn_EE.tau1 = Syn_EE_rise			// to make sure changes in syn params 
                                  // take place in the network
   syn_EE.tau2 = Syn_EE_decay
   
   syn_EE.e = SynE_EE

    for i = 0,pre_list_EE.count()-1 {
		  net_c_principalneuron = pre_list_EE.object(i)		// get netCon object from list
		  net_c_principalneuron.active($1)
		}
}



proc change_Imu_principalneuron() {
  if (numarg()<1) {
	 drv_principalneuron.amp = Imu_principalneuron*f_surf
	} else {
	 drv_principalneuron.amp = $1*f_surf
	}
}

// ****Background synaptic drive****
proc bgdrive() {
    strength = $2*f_surf
    bgdrive_list.append( new NetCon($o1,bgsyn,10,0,strength) )    
}

// ****Shaped input****
proc inj_input() {
  injvec = new Vector(tstop/inj_step)
  // $1 is the multiplicative factor that depends on the spatial position of the cell in the net!
  injvec = temiinj_PN.c.mul(f_surf*$1)
  // $2 is a variability factor determined by spainput_on_sd
  for i = tPNinj_on/inj_step,$2/inj_step {
      injvec.x[i-1] = 0
  }
  injvec.play(&inj_PN.amp,iinj_time,1)
}

proc signinput() {
    strength = $2*f_surf
    signinput_list.append( new NetCon($o1,signsyn,10,0,strength) )    
}

endtemplate Principalneuron