ModelDB is moving. Check out our new site at https://modeldb.science. The corresponding page is https://modeldb.science/144570.

Large scale model of the olfactory bulb (Yu et al., 2013)

 Download zip file 
Help downloading and running models
Accession:144570
The readme file currently contains links to the results for all the 72 odors investigated in the paper, and the movie showing the network activity during learning of odor k3-3 (an aliphatic ketone).
Reference:
1 . Yu Y, McTavish TS, Hines ML, Shepherd GM, Valenti C, Migliore M (2013) Sparse distributed representation of odors in a large-scale olfactory bulb circuit. PLoS Comput Biol 9:e1003014 [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network; Channel/Receptor; Dendrite;
Brain Region(s)/Organism: Olfactory bulb;
Cell Type(s): Olfactory bulb main mitral GLU cell; Olfactory bulb main interneuron granule MC GABA cell;
Channel(s): I Na,t; I A; I K;
Gap Junctions:
Receptor(s): NMDA; Glutamate; Gaba;
Gene(s):
Transmitter(s): Gaba; Glutamate;
Simulation Environment: NEURON;
Model Concept(s): Pattern Recognition; Activity Patterns; Bursting; Temporal Pattern Generation; Oscillations; Synchronization; Active Dendrites; Detailed Neuronal Models; Synaptic Plasticity; Action Potentials; Synaptic Integration; Unsupervised Learning; Olfaction;
Implementer(s): Hines, Michael [Michael.Hines at Yale.edu]; Migliore, Michele [Michele.Migliore at Yale.edu];
Search NeuronDB for information about:  Olfactory bulb main mitral GLU cell; Olfactory bulb main interneuron granule MC GABA cell; NMDA; Glutamate; Gaba; I Na,t; I A; I K; Gaba; Glutamate;
/
YuEtAl2012
readme.html
ampanmda.mod
fi.mod
kamt.mod *
kdrmt.mod *
naxn.mod *
ThreshDetect.mod *
.hg_archival.txt
allsynhinton.hoc *
antest.ses *
clear.hoc *
connect.hoc
control.ses
default.hoc
granule.hoc *
hinton.hoc
init.hoc *
iterator.hoc *
lindgren.job
lptiter.hoc
mgrs.hoc
michele_movie.hoc
mitral.hoc
mosinit.hoc *
net.hoc
odors.txt
odors-forsim500-kensaku.txt
param.hoc
parinit.hoc
pattern.hoc
perfrun.hoc
record.hoc
show.hoc
showstim.hoc
showw.hoc
somesyn.hoc *
spike2file.hoc
spkdat2bin.hoc
split.hoc
start.hoc
start.ses *
stim-AB-rnd-500mt.hoc
stim-o11o12.hoc
stim-o14.hoc
stim-o26.hoc
stim-o26d1-mnoise5hz-gnoise-5s.hoc
stim-o5high-o6low.hoc
stim-odors-AB-seq.hoc
stim-pair.hoc
stim-seq-rnd.hoc
subset.hoc
subset_control.ses *
viewspikes.hoc
viewspikes1.hoc
weight_movie.hoc *
weightsave.hoc
                            
//mitral-granule reciprocal synapse

//src, target
// assume src,target unique
func syn_gid() {local i
    if ($1 < nmitral) { // target is granule
	i = ($2 * nmitral + $1 + 1 + ncell) * 100 + 1
    }else{ // target is mitral
	i = ($1 * nmitral + $2 + 1 + ncell) * 100
    }
    return i
}

// gid, &mitral, &granule, &is_m2g
proc gid2mg() {local i, m, g, m2g
	m2g = $1%2
	i = $1 - m2g
	i /=100
	i -= ncell + 1
	m = i%nmitral
	i -= m
	g = i/nmitral - nmitral
	$&2 = m
	$&3 = g
	$&4 = m2g
}

// imitral, igranule, target_is_granule
proc test_gid2mg() {local gid, m, g, is_m2g
	if ($3 == 0) {
		gid = syn_gid($2+nmitral, $1)
	}else{
		gid = syn_gid($1, $2+nmitral)
	}
	gid2mg(gid, &m, &g, &is_m2g)
	printf("gid2mg gid=%g m=%d g=%g is_m2g=%g\n", gid, m, g, is_m2g)
}

begintemplate MGRS
public md, gd, md_gid, gd_gid, clear, complete
public fi, ampanmda,  mitral, granule, mitral_gid, granule_gid
public md2ampanmda, gd2fi, spine
public fi_exists, ampa_exists, mexist, gexist
public sm, sg, wm, wg, set_sm, set_sg, ws_str
public pr
external pc, pnm, syn_gid
external ncell, nmitral  //, nil,amp, rel, inh,synst, nmdafactor
external gid2piece, piecegid
external global_fi_tau1, global_fi_tau2, global_exc_gmax, global_inh_gmax
objref mitral, granule
objref md2ampanmda, gd2fi
objref ampanmda, fi, md, gd, spine
objref this, nil, ws_str_

strdef tstr 

proc clear() {
	objref md2ampanmda, gd2fi
	objref ampanmda, fi, md, gd
	objref mitral, granule, spine
}

proc init() {
    // if $7 == 1 then create fi and ampamda and put in cas
    ws_str_ = new String()
    mitral_gid = $1
    granule_gid = $4
    mexist = piecegid(mitral_gid) >= 0
    gexist = piecegid(granule_gid) >= 0
    md_gid = syn_gid(granule_gid, mitral_gid)
    gd_gid = syn_gid(mitral_gid, granule_gid)
    mitral = gid2piece(mitral_gid)
    granule = gid2piece(granule_gid)
    if (mexist) if (section_exists($s2, mitral)) {
//	print mitral
	create_syn("{mitral.%s { fi = new FastInhib(%-10.20g )}}",$s2, $3)
	create_syn("{mitral.%s { md = new ThreshDetect(%-10.20g)}}",$s2, $3)
	pc.set_gid2node(md_gid, pc.id)
	pc.cell(md_gid, new NetCon(md, nil), 1)
//      fi.gmax=0.003 // see update_netcon below
    }

    if (gexist) {
	spine = new GranuleSpine()
	create_syn("{granule.%s { connect spine.neck(0), (%-10.20g) }}", $s5, $6)
	spine.head { ampanmda = new AmpaNmda(0.5) }
	spine.head { gd = new ThreshDetect(0.5)}
	pc.set_gid2node(gd_gid, pc.id)
	pc.cell(gd_gid, new NetCon(gd, nil), 1)
//      ampanmda.gmax=1		//default is 2 // see update_netcon below
    }
//    print pnm.myid, this, mexist, gexist

    if ($7 == 1) { // for showing synapses and weights when cells do not exist
	complete()
    }
    update_netcon()
}

proc complete() {
	if (object_id(fi) == 0) {
		fi = new FastInhib(0.5)
	}
	if (object_id(ampanmda) == 0) {
		ampanmda = new AmpaNmda(0.5)
	}
	update_netcon()
}

proc update_netcon() {
    if (object_id(ampanmda)) {
//	print pnm.myid, this, mitral_gid, granule_gid
//	print pnm.myid, this, md_gid,gd_gid
	if (object_id(md2ampanmda) == 0) {
		md2ampanmda = pc.gid_connect(md_gid, ampanmda)
	}
//	print pnm.myid, this, md2ampanmda, 
	ampanmda.mgid = mitral_gid
	ampanmda.ggid = granule_gid
	ampanmda.srcgid = md_gid
	ampanmda.gmax = global_exc_gmax
    }
    if (object_id(fi)) {
//	print pnm.myid, this, mitral_gid, granule_gid
//	print pnm.myid, this, md_gid,gd_gid
	if (object_id(gd2fi) == 0) {
		gd2fi   = pc.gid_connect(gd_gid, fi  )
	}
//	print pnm.myid, this, gd2fi
	fi.mgid = mitral_gid
	fi.ggid = granule_gid
	fi.srcgid = gd_gid
	fi.gmax = global_inh_gmax
	fi.tau1 = global_fi_tau1
	fi.tau2 = global_fi_tau2
    }
//    print pnm.myid, this, mitral_gid, granule_gid, mitral, granule
    
    if (object_id(md2ampanmda)) {
	md2ampanmda.weight = 1 // normalized
	md2ampanmda.delay = 1
    }
    if (object_id(gd2fi)) {
	gd2fi.weight = 1 // normalized
	gd2fi.delay = 1
    }
}

proc create_syn() {
    sprint(tstr, $s1, $s2, $3)
    execute(tstr, this)
}

func fi_exists() {
    return (fi != nil)
}
func ampa_exists() {
    return (ampanmda != nil)
}

proc pr() {local x  localobj s
	s = new String()
	if (object_id(md)) {
		x = md.get_loc()
		sprint(s.s, "%s(%g) %d --- ", secname(), x, mitral_gid)
		pop_section()
	}else{
		sprint(s.s, "%27d --- ", mitral_gid)
	}
	if (object_id(gd)) {
		x = gd.get_loc()
		sprint(s.s, "%s%d %s(%g)", s.s, granule_gid, secname(), x)
		pop_section()
	}else{
		sprint(s.s, "%s%d", s.s, granule_gid)
	}
	printf("%d %s\n", pnm.myid, s.s)
}

//returns volatile String in proper wsfile format
// srcid tarid s w
// may be one line or two, no trailing newline
obfunc ws_str() {
	if (object_id(gd2fi)) {
		if (object_id(md2ampanmda)) {
			sprint(ws_str_.s, "%d %d %g %g\n%d %d %g %g",\
				granule_gid, mitral_gid, sm(), wm(),\
				mitral_gid, granule_gid, sg(), wg())
		}else{
			sprint(ws_str_.s, "%d %d %g %g",\
				granule_gid, mitral_gid, sm(), wm())
		}
	}else if (object_id(md2ampanmda)) {
		sprint(ws_str_.s, "%d %d %g %g", mitral_gid, granule_gid, sg(), wg())
	}else{
		ws_str_.s = ""
	}
	return ws_str_
}

proc set_sm() {
	if (object_id(gd2fi)) {
		gd2fi.weight[1] = $1
		gd2fi.weight[2] = gd2fi.weight[0]*fi.plast($1)
	}
}
proc set_sg() {
	if (object_id(md2ampanmda)){
		md2ampanmda.weight[1] = $1
		md2ampanmda.weight[2] = md2ampanmda.weight[0]*ampanmda.plast($1)
	}
}
func sm() {
	return gd2fi.weight[1]
}
func sg() {
	return md2ampanmda.weight[1]
}
func wm() {
	return gd2fi.weight[2] * fi.gmax
}
func wg() {
	return md2ampanmda.weight[2] * ampanmda.gmax
}

endtemplate MGRS

objref mgrs_list
mgrs_list = new List()

obfunc mk_mgrs() { local  mitral_gid, granule_gid    localobj mgrs
    //$1 is the imitral, $s2 section name, $3 section arc position,
    //$4 is the igranule, $s5 section name, $6 section arc position
    mitral_gid = $1
    granule_gid = $4 + ngranule_begin
    if ($7 || exists(mitral_gid, $s2) || exists(granule_gid, $s5)) {
	mgrs = new MGRS(mitral_gid, $s2, $3, granule_gid, $s5, $6, $7)
	mgrs_list.append(mgrs)
	return mgrs
    }
    return nil
}

Loading data, please wait...