Hippocampal CA1 NN with spontaneous theta, gamma: full scale & network clamp (Bezaire et al 2016)

 Download zip file 
Help downloading and running models
Accession:187604
This model is a full-scale, biologically constrained rodent hippocampal CA1 network model that includes 9 cells types (pyramidal cells and 8 interneurons) with realistic proportions of each and realistic connectivity between the cells. In addition, the model receives realistic numbers of afferents from artificial cells representing hippocampal CA3 and entorhinal cortical layer III. The model is fully scaleable and parallelized so that it can be run at small scale on a personal computer or large scale on a supercomputer. The model network exhibits spontaneous theta and gamma rhythms without any rhythmic input. The model network can be perturbed in a variety of ways to better study the mechanisms of CA1 network dynamics. Also see online code at http://bitbucket.org/mbezaire/ca1 and further information at http://mariannebezaire.com/models/ca1
References:
1 . Bezaire MJ, Raikov I, Burk K, Vyas D, Soltesz I (2016) Interneuronal mechanisms of hippocampal theta oscillations in a full-scale model of the rodent CA1 circuit. Elife [PubMed]
2 . Bezaire M, Raikov I, Burk K, Armstrong C, Soltesz I (2016) SimTracker tool and code template to design, manage and analyze neural network model simulations in parallel NEURON bioRxiv
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism: Hippocampus;
Cell Type(s): Hippocampus CA1 pyramidal GLU cell; Hippocampus CA1 interneuron oriens alveus GABA cell; Hippocampus CA1 basket cell; Hippocampus CA1 stratum radiatum interneuron; Hippocampus CA1 bistratified cell; Hippocampus CA1 axo-axonic cell; Hippocampus CA1 PV+ fast-firing interneuron;
Channel(s): I Na,t; I K; I K,leak; I h; I K,Ca; I Calcium;
Gap Junctions:
Receptor(s): GabaA; GabaB; Glutamate; Gaba;
Gene(s):
Transmitter(s): Gaba; Glutamate;
Simulation Environment: NEURON; NEURON (web link to model);
Model Concept(s): Oscillations; Methods; Connectivity matrix; Laminar Connectivity; Gamma oscillations;
Implementer(s): Bezaire, Marianne [mariannejcase at gmail.com]; Raikov, Ivan [ivan.g.raikov at gmail.com];
Search NeuronDB for information about:  Hippocampus CA1 pyramidal GLU cell; Hippocampus CA1 interneuron oriens alveus GABA cell; GabaA; GabaB; Glutamate; Gaba; I Na,t; I K; I K,leak; I h; I K,Ca; I Calcium; Gaba; Glutamate;
/*
Encapsulates a NetStim and an SGate artificial spiking cell connected like this
  NS--< SGate
so that the SGate's output is a spike train whose "instantaneous mean frequency"
is modulated by a sinusoid of the form
1 + depth*(cos(2*PI*(t-start)/period) - 1)/2
Thus the mean spike frequency varies between a maximum of fmax = 1/ns.interval
and a minimum of fmin = fmax*(1-depth).

If you need statistically independent spike streams, be sure to pair
the NetStim and the SGate with separate instances of the Random class
as per the comments in their NMODL source code.

Remark to myself:  consider using an FInitializeHandler 
to turn the NetStim on & off.

NTC 5/2/2012
*/

begintemplate sintrain
	public pp // this is the thing that should be the spike source for NetCons
	// associate this with a Random.uniform(0,1) instance for statistical independence
	public ns // to make it easy to associate the NetStim with its own Random.negexp(1)
	public fmax // arg is in Hz!
	public noise, start, period, number, depth, phase
	public connect_pre, is_art, randi, gid, noiseFromRandomPP, noiseFromRandomNS, setnoiseFromRandomPP, setnoiseFromRandomNS
	public x, y, z, position, xpos, ypos, zpos

  objref ns, pp, nc

  proc init() {
 		gid = $1
		randi = $2

	ns = new MyNetStim(.5)
    pp = new SGate()
    nc = new NetCon(ns, pp)
    nc.delay = 0

    ns.number = 1e9
    fmax(1000)
    noise(1)
    start(0)

    period(150)
    number(1)
    depth(0.75)
    phase(0)
	
	ns.gid = $1
	ns.randi = $2
	
	pp.gid = $1
	pp.randi = $2
  }

  // the following are to be used for setting/getting param values

  func fmax() { local retval
    if (numarg()==1) {
      retval = $1
      if (retval<=0) {
        print retval, " out of range for high frequency"
        retval = -1 // return -1 to signal an error
      } else {
        ns.interval = 1000/retval
      }
    } else {
     retval = 1000/ns.interval
    }
    return retval
  }

  func noise() {
    if (numarg()==1) {
      retval = $1
      if ((retval<0) || (retval>1)) {
        print retval, " out of range for noise"
        retval = -1
      } else {
        ns.noise = retval
      }
    } else {
      retval = ns.noise
    }
    return retval
  }

  func start() {
    if (numarg()==1) {
      retval = $1
      if (retval<0) {
        print retval, " out of range for start time"
        retval = -1
      } else {
        ns.start = retval // no point having ns generate anything before it is needed
        pp.start = retval
      }
    } else {
      retval = ns.start
    }
    return retval
  }

  func period() {
    if (numarg()==1) {
      retval = $1
      if (retval<=0) {
        print retval, " out of range for modulation period"
        retval = -1 // return -1 to signal an error
      } else {
        pp.period = retval
      }
    } else {
      retval = pp.period
    }
    return retval
  }

  func phase() {
    if (numarg()==1) {
      retval = $1
      if (retval<0) {
        print retval, " phase less than 0"
        pp.phase = 0
      } else {
        pp.phase = retval
      }
    } else {
      retval = pp.phase
    }
    return retval
  }

  func number() {
    if (numarg()==1) {
      retval = $1
      if (retval<=0) {
        print retval, " out of range for number of modulation periods"
        retval = -1 // return -1 to signal an error
      } else {
        pp.number = retval
      }
    } else {
      retval = pp.number
    }
    return retval
  }

  func depth() {
    if (numarg()==1) {
      retval = $1
      if ((retval<0) || (retval>1)) {
        print retval, " out of range for modulation depth"
        retval = -1 // return -1 to signal an error
      } else {
        pp.depth = retval
      }
    } else {
      retval = pp.depth
    }
    return retval
  }

  // these last three are cribbed from Network Builder hoc code--
  // they'd be part of any template based on an artificial spiking cell


  obfunc connect_pre() { localobj nc
    nc = new NetCon(pp, $o1)
    if (numarg() == 2) { $o2 = nc }
    return nc
  }

	func is_art() {return 1}
	

	proc position(){
		x = $1  y = $2  z = $3	
		xpos = $1  ypos = $2  zpos = $3	
		ns.position(xpos, ypos, zpos)
	}
 
  proc setnoiseFromRandomPP() {
  	pp.noiseFromRandom($o1) // pass an instance of the Random class that is set to the Random.uniform(0,1) distribution for the gate
  }
  proc setnoiseFromRandomNS() {
  	ns.noiseFromRandom($o1) // pass an instance of the Random class that is set to the Random.negexp(1) distribution for the poisson spike train
  }

endtemplate sintrain

Loading data, please wait...