Synchrony by synapse location (McTavish et al. 2012)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:144054
This model considers synchrony between mitral cells induced via shared granule cell interneurons while taking into account the spatial constraints of the system. In particular, since inhibitory inputs decay passively along the lateral dendrites, this model demonstrates that an optimal arrangement of the inhibitory synapses will be near the cell bodies of the relevant mitral cells.
Reference:
1 . McTavish TS, Migliore M, Shepherd GM, Hines ML (2012) Mitral cell spike synchrony modulated by dendrodendritic synapse location. Front Comput Neurosci 6:3 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network; Neuron or other electrically excitable cell;
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): GabaB; AMPA; NMDA;
Gene(s):
Transmitter(s):
Simulation Environment: NEURON;
Model Concept(s): Synchronization; Olfaction;
Implementer(s): McTavish, Thomas S [thomas.mctavish at yale.edu];
Search NeuronDB for information about:  Olfactory bulb main mitral GLU cell; Olfactory bulb main interneuron granule MC GABA cell; GabaB; AMPA; NMDA; I Na,t; I A; I K;
/
mctavish_syncbylocation
src
ampanmda.mod
fi.mod
kamt.mod
kdrmt.mod
naxn.mod
ThreshDetect.mod *
allsynhinton.hoc *
analysis.py
animtest.py
antest.ses *
bulbspikes.py
clear.hoc
connect.hoc
control.ses
default.hoc
granule.hoc *
hinton.hoc
init.hoc *
iterator.hoc *
lptiter.hoc
mgrs.hoc
michele_movie.hoc
mitral.hoc
mosinit.hoc
net.hoc
param.hoc
params.py
parinit.hoc
pattern.hoc
perfrun.hoc
show.hoc
showw.hoc
somesyn.hoc *
sortspike *
split.hoc
start.hoc
start.ses
stimodors.hoc
subset.hoc
subset_control.ses *
synweightsnapshot.py
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 < num_mitral) { // target is granule
	i = ($2 * num_mitral + $1 + 1 + ncell) * 100 + 1
    }else{ // target is mitral
	i = ($1 * num_mitral + $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%num_mitral
	i -= m
	g = i/num_mitral - num_mitral
	$&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+num_mitral, $1)
	}else{
		gid = syn_gid($1, $2+num_mitral)
	}
	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, set_wm, set_wg, ws_str, ws_str_normalized
public pr
external pc, pnm, syn_gid, fi_gmax, fi_tau1, fi_tau2, ampanmda_gmax
external ncell, num_mitral  //, nil,amp, rel, inh,synst, nmdafactor
external gid2piece, piecegid
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=fi_gmax
        fi.tau1=fi_tau1
        fi.tau2=fi_tau2
    }

    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=ampanmda_gmax		//default is 2
    }
//    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
    }
    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
    }
//    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_
}

obfunc ws_str_normalized() {
	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_normalized(),\
				mitral_gid, granule_gid, sg(), wg_normalized())
		}else{
			sprint(ws_str_.s, "%d %d %g %g",\
				granule_gid, mitral_gid, sm(), wm_normalized())
		}
	}else if (object_id(md2ampanmda)) {
		sprint(ws_str_.s, "%d %d %g %g", mitral_gid, granule_gid, sg(), wg_normalized())
	}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)
	}
}

// Normalized weights
proc set_wm() { local val, max, min
    if (object_id(gd2fi)) {
        val = $1
        max = 1.-(1./(1.+exp( 25./3.))) //fi.sighalf/fi.sigslope))
        min = 1.-(1./(1.+exp(-25./3.))) //fi.sighalf/fi.sigslope))

        if (val > max) {
            val = max
        }
        if (val < min) {
            val = min
        }

        gd2fi.weight[1] = fi.norm_weight_to_sig(val)
        gd2fi.weight[2] = gd2fi.weight[0] * val
    }
}

// Normalized weights
proc set_wg() { local val, max, min
    if (object_id(md2ampanmda)){
        val = $1
        max = 1.-(1./(1.+exp( 25./3.))) //ampanmda.sighalf/fi.sigslope))
        min = 1.-(1./(1.+exp(-25./3.))) //ampanmda.sighalf/fi.sigslope))
        if (val > max) {
            val = max
        }
        if (val < min) {
            val = min
        }

        md2ampanmda.weight[1] = ampanmda.norm_weight_to_sig(val)
        md2ampanmda.weight[2] = val //md2ampanmda.weight[0] * $1 // * ampanmda.gmax
    }
}

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
}

func wm_normalized() {
	return gd2fi.weight[2]
}
func wg_normalized() {
	return md2ampanmda.weight[2]
}

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 + num_granule_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
}