// build_net_Shep_NSG.hoc
// builds simple model
// OSN input goes to two mitral cells
// which are connected to two granule cell and periglomerular cells
// Slightly more complicated nets are also generated with duplicated columns
load_file("mct_cells.hoc") // loads the McTavish cell templates Mitral and Granule and new ET
load_file("event_generator/gen_events.hoc")
// The num_of_columns.hoc with relative path run_X, (X=0,1,...,num of sims) set
// previously (NSG version sets it in init.py)
// The variable n stores the number of columns other than the first (recordings
// from the mitral cell soma for the tank defines the first) column
// note that num_of_columns.hoc can be generated from other code
xopen(num_of_columns_dot_hoc_file) //"run_X/num_of_columns.hoc")
// reading in the number of columns is convenient for batch running jobs
// n= 2 // num_of_columns = 1 // number of other columns than m1, n easier to type than num_of_columns
objref m1, m2[n], gc1[n], gc2[n], pg1[n], pg2[n], et1, et2[n]
// gc1's are granule cells that are close to m1 cell body, gc2's are gcs that are far from m1 cell bodies
// likewise for pg1[n] (close to m1: dendrites on m1 tuft, axon on m2[i] primary dend) and
// pg2[n] (pg2 cell bodies far from m1 cell body: pg2[i] dendrites on m2[i] tuft, axon on m1 primary dend)
// Similarly the et1 cells excitatory connections to the m1 tuft and the pg1 dendrites while the et2 cells
// have excitatory connections to the m2 cells tufts and the pg2 cells dendrites
m1 = new Mitral()
et1 = new ET() // because the ET cells do not connect (directly) to other glomeruli we only need one per glom
// The granule cells will require multiple cells per glom because they can receive inputs from both the local
// mitral cell and one from an adjacent glom.
for i=0,n-1 {
m2[i] = new Mitral() //
gc1[i] = new Granule()
gc2[i] = new Granule()
pg1[i] = new PGcell(0) // the number 0 passed to PGcell() is the nicot. current
pg2[i] = new PGcell(0) // the number 0 passed to PGcell() is the nicot. current
et2[i] = new ET()
}
// OSNXs will be representing breathing OSN activity while LightXs are repr. of light
// stim. OSN activity (events)
objref OSN1, OSN2[n], Light1, Light2[n]
// Located arbitrarily because where they have an
// effect is determined by the NetCon target not the
// VecStim (source) position
breathing_period = 400 // 400 ms is typical breathing period
breath_gauss_center = 0 // 0 makes peak occur right at start (and end) of breath
breath_half_width = 10 // 10 makes for a narrow peak
breath_peak_rate = 240 // 150 // 150 or 300 OK to represent thousands of OSN's converging onto a mc
// share these parameters for mitral cell 1 and 2 except for
// lightX_peak_rate which can be used to turn off and on each
light_period = 300 // 398 // 300 for debugging // light interval period
light_gauss_center = 0 // 0 makes peak occur right at start (and end) of light
light_half_width = 10 // 10 makes for a narrow peak
light1_peak_rate = 240 // 40 for much less // 300 // 150 or 300 OK to represent thousands of OSN's converging onto a mc
objref light2_peak_rate_vec
light2_peak_rate_vec = new Vector(n) // will store peak rates - develop later - to do
light2_peak_rate = 0 // 150 or 300 OK to represent thousands of OSN's converging onto a mc
// OSNX provides source events for breathing synaptic events
// note that the (arbitrary) location of VecStim artificial cells when created does not determine
// what they are connected to, the NetCon's do that!
m1.tuftden OSN1 = new VecStim(0.5) // previously ThetaStim(0.5)
for i=0,n-1 {
m1.tuftden OSN2[i] = new VecStim(0.5) // breath inputs to all the external columns
}
// LightX provides source events for light synaptic events
m1.tuftden Light1 = new VecStim(0.5) // previously ThetaStim(0.5)
for i=0,n-1 {
m1.tuftden Light2[i] = new VecStim(0.5) // potential trains of inputs to external cols.
}
// backgroundX is representative of background activity that causes mitral cell tuft excitatory events
// at any phase of the breath cycle. The _m1 is for input to the m1 mc tuft,
// background1, background2 is for the inputs to the pg1[i] and pg2[i] cells.
// background2 also shares it's input with the m2[i] tufts
objref background_m1, background1[n], background2[n]
m1.tuftden background_m1 = new NetStim(0.5) // additional constant input onto mitral 1.
for i=0,n-1 {
m1.tuftden background1[i] = new NetStim(0.5)
m1.tuftden background2[i] = new NetStim(0.5)
}
// introduce synapses so they can be targets in NetCons:
// name conventions:
// cell name of post synaptic partner _ cell name of pre synaptic partner _ synapse type
// or for shared synapses
// cell name of post synaptic partner _ synapse type
objref m1_glut, m2_glut[n] // excitation of mitral tufts by osn cells
// excitation of mitral tufts by the newly added et cells will also
// take place on the m1_glut m2_glut[n] synapses
objref m1_gc1_inhib[n], m2_gc1_inhib[n] // inhibition of mitral dends by gc
objref m1_gc2_inhib[n], m2_gc2_inhib[n] // inhibition of mitral dends by gc2
objref gc1_m1_glut[n], gc1_m2_glut[n] // excitation of gc by mitral cells
objref gc2_m1_glut[n], gc2_m2_glut[n]
// pg cells:
objref pg1_glut[n], pg2_glut[n] // excitation of peri-glom cells by osn, mitral cells, light, background, et cells
objref m1_inhib[n], m2_inhib[n] // inhibition in the mitral cell tufts by both the local (same number
// et cells:
objref et1_glut, et2_glut[n] // excitation of et cells by either light (Light1, Light2) or respiratory input (OSN1, OSN2)
// as mitral cell)
objref m1priden_inhib[n], m2priden_inhib[n]
// and the remote pg cell (different number than mitral cell)
tuft_excite_pos = 0.5
// we could study multiple dendrites in the tuft later however for now there
// is just one tuft dendrite per mitral cell
m1.tuftden m1_glut = new AmpaNmda(tuft_excite_pos)
et1.tuftden et1_glut = new AmpaNmda(tuft_excite_pos)
for i=0, n-1 {
m2[i].tuftden m2_glut[i] = new AmpaNmda(tuft_excite_pos)
et2[i].tuftden et2_glut[i] = new AmpaNmda(tuft_excite_pos)
}
// the two below MC GC positions are reused for m1, m2, gc1, gc2
mc_gc_close_recip_pos = 0.01
mc_gc_far_recip_pos=.75
// original reicprocal position on the secondary dendrite:
for i=0,n-1 {
m1.secden m1_gc1_inhib[i] = new FastInhib(mc_gc_close_recip_pos)
m1.secden m1_gc2_inhib[i] = new FastInhib(mc_gc_far_recip_pos)
m2[i].secden m2_gc1_inhib[i] = new FastInhib(mc_gc_far_recip_pos)
m2[i].secden m2_gc2_inhib[i] = new FastInhib(mc_gc_close_recip_pos)
}
/**/
// move the gc reciprocal inhibition position to mitral cell body
// for maximum effect:
// m1.soma m1_gc1_inhib = new FastInhib(0.5)
// m2.soma m2_gc2_inhib = new FastInhib(0.5)
gc_recip_pos1 = 0.55
gc_recip_pos2 = 0.65
for i=0, n-1 {
gc1[i].priden2 gc1_m1_glut[i] = new AmpaNmda(gc_recip_pos1)
gc1[i].priden2 gc1_m2_glut[i] = new AmpaNmda(gc_recip_pos2)
gc2[i].priden2 gc2_m1_glut[i] = new AmpaNmda(gc_recip_pos2)
gc2[i].priden2 gc2_m2_glut[i] = new AmpaNmda(gc_recip_pos1)
}
// these mitral cell tuft inhibitory synapses are contacted by both the local and remote pg cells
// the local pg cell is from a reciprocal synapse and the remote is from an "axon"
tuft_inhib_pos = 0.5 // for now make overlap with the tuft excitatory position
for i=0, n-1 {
m1.tuftden m1_inhib[i] = new FastInhib(tuft_inhib_pos)
m2[i].tuftden m2_inhib[i] = new FastInhib(tuft_inhib_pos)
priden_inhib_pos = 0.9
m1.priden m1priden_inhib[i] = new FastInhib(priden_inhib_pos)
m2[i].priden m2priden_inhib[i] = new FastInhib(priden_inhib_pos)
// pg cell excitatory synapse part of reciprocal synapses and site of OSN input
pg1[i].gemmbody pg1_glut[i] = new AmpaNmda(0.5) // put in middle of pg spine
pg2[i].gemmbody pg2_glut[i] = new AmpaNmda(0.5) // put in middle of pg spine
}
/////////////////////////////////////////////////////
//
// connect the network
//
/////////////////////////////////////////////////////
num_of_netcon_types = 34
objref nc[num_of_netcon_types][n]
objref nclist
nclist = new List()
// connect the OSNs to the mcs
// breath to mc1
nc[0][0] = new NetCon(OSN1, m1_glut, 0, 1, 1)
// light to mc1
nc[6][0] = new NetCon(Light1, m1_glut, 0, 1, 1) // arguments are source, target, threshold, delay, weight
// connect the background stimulus
nc[8][0] = new NetCon(background_m1, m1_glut, 0, 1, 1) // arguments are source, target, threshold, delay, weight
// arguments are source, target, threshold, delay, weight
for i=0, n-1 {
nc[1][i] = new NetCon(OSN2[i], m2_glut[i])
// connect the Lights to the mcs
nc[7][i] = new NetCon(Light2[i], m2_glut[i]) // the 2's refer to the external col.
// connect the reciprocal synapse between m1 and gc1
m1.secden[0] {nc[2][i] = new NetCon(&v(mc_gc_close_recip_pos), gc1_m1_glut[i], -20, 1, 1)}
gc1[i].priden2[0] {nc[3][i] = new NetCon(&v(gc_recip_pos1), m1_gc1_inhib[i], -20, 1, 1)}
// load_file("sample_gc1_v_graph.ses")
// connect the reciprocal synapse between m2 and gc1
m2[i].secden[0] {nc[4][i] = new NetCon(&v(mc_gc_far_recip_pos), gc1_m2_glut[i])}
gc1[i].priden2[0] {nc[5][i] = new NetCon(&v(gc_recip_pos2), m2_gc1_inhib[i])}
print "for nc[3][i's] gc_recip_pos1 = ", gc_recip_pos1
print " for nc[5][i's] gc_recip_pos2= ", gc_recip_pos2
// connect the reciprocal synapse between m1 and gc2
m1.secden[0] {nc[10][i] = new NetCon(&v(mc_gc_far_recip_pos), gc2_m1_glut[i], -20, 1, 1)}
gc2[i].priden2[0] {nc[11][i] = new NetCon(&v(gc_recip_pos2), m1_gc2_inhib[i])}
print " for nc[11] gc_recip_pos2 = ", gc_recip_pos2
// connect the reciprocal synapse between m2 and gc2
m2[i].secden[0] {nc[12][i] = new NetCon(&v(mc_gc_close_recip_pos), gc2_m2_glut[i])}
// gc1.priden2[0] {nc[13] = new NetCon(&v(gc_recip_pos1), m2_gc2_inhib)} // typo of providing gc1.priden2[0]
// location seems to take away from nc[3]? Is that the intended behavior for NEURON?
gc2[i].priden2[0] {nc[13][i] = new NetCon(&v(gc_recip_pos1), m2_gc2_inhib[i])}
print " for nc[13] gc_recip_pos1 = ", gc_recip_pos1
// connect the background stimulus
nc[9][i] = new NetCon(background2[i], m2_glut[i])
// connect the periglomerular cells
// all the connections to periglom 1:
// excited by background, OSN1, Light1, mitral cell 1
// output inhibits mitral cell 1 with dendro-dendritic reciprocal synapse
// and inhibits mitral cell 2 with axonal synapse
////////////////// 20150508 stopping place: keep going here later - finish loop - test - fix gui.
nc[14][i] = new NetCon(background1[i], pg1_glut[i])
nc[15][i] = new NetCon(OSN1, pg1_glut[i]) // makes it possible to connect the breath to all the pg1_glut[i]
nc[16][i] = new NetCon(Light1, pg1_glut[i]) // makes it possible to connect Light1 to all the pg1_glut[i]
m1.tuftden {nc[17][i] = new NetCon(&v(0.5), pg1_glut[i])} // excitatory connections from m1 onto pg1 dends
pg1[i].gemmbody {nc[18][i] = new NetCon(&v(0.5), m1_inhib)} // reciprocal connections from pg1 dends back to m1
pg2[i].soma {nc[19][i] = new NetCon(&v(0.5), m1priden_inhib) } // pg2's axon connections to m1
// all the connections to periglom 2:
// excited by background, OSN2, Light2, mitral cell 2
// output inhibits mitral cell 2 with dendro-dendritic reciprocal synapse
// and inhibits mitral cell 1 with axonal synapse
nc[20][i] = new NetCon(background2[i], pg2_glut[i]) // background2 input onto pg2's
nc[21][i] = new NetCon(OSN2[i], pg2_glut[i]) // breathing inputs onto pg2
nc[22][i] = new NetCon(Light2[i], pg2_glut[i]) // light inputs onto pg2
m2[i].tuftden {nc[23][i] = new NetCon(&v(0.5), pg2_glut[i])} // m2 inputs onto pg2
pg2[i].gemmbody {nc[24][i] = new NetCon(&v(0.5), m2_inhib[i])} // pg2 recip connections back to m2
pg1[i].soma {nc[25][i] = new NetCon(&v(0.5), m2priden_inhib[i]) } // pg1 axon connections to m2 pri dends
}
// new connections for et cells
// nc index, description
// 26 Light1 -> et1
// 27 OSN1 -> et1
// 28 et1 -> mc1 tuft
// 29 et1 -> pg1 tuft
// 30 Light2 -> et2
// 31 OSN2 -> et2
// 32 et2 -> mc2 tuft
// 33 et2 -> pg2 tuft
nc[26][0] = new NetCon(Light1, et1_glut, 0, 1, 1) // arguments are source, target, threshold, delay, weight
nc[27][0] = new NetCon(OSN1, et1_glut, 0, 1, 1)
et1.soma nc[28][0] = new NetCon(&v(0.5), m1_glut, 0, 1, 1) // note that the soma connections are a proxy for the axons
for i=0,n-1 { // i is index over additional columns
et1.soma {nc[29][i] = new NetCon(&v(0.5), pg1_glut[i], 0, 1, 1)} // excitatory connections from et1 onto pg1 dends
nc[30][i] = new NetCon(Light2[i], et2_glut[i], 0, 1, 1) // light inputs onto et2
nc[31][i] = new NetCon(OSN2[i], et2_glut[i], 0, 1, 1) // breathing inputs onto et2
et2[i].soma {nc[32][i] = new NetCon(&v(0.5), m2_glut[i], 0, 1, 1)}
et2[i].soma {nc[33][i] = new NetCon(&v(0.5), pg2_glut[i], 0, 1, 1)}
}
// store all netcons in a list for easy access
for columns=0,n-1 {
for i=0,num_of_netcon_types-1 {
nclist.append(nc[i][columns])
}
}
/////////////////////////////////////////////////////
//
// Adjust plasticity of FastInhib and AmpaNmda
//
/////////////////////////////////////////////////////
// it was decided the easiest thing to do was turn off
// plasticity in the AmpaNmda and FastInhib mod files
/*
// test section
objref test_gc
m1.tuftden test_gc = new ThetaStim(0.5) // stimulate granule cell synapse directly
objref test_nc
test_nc = new NetCon(test_gc, gc1_m1_glut)
objref test_gc2
m1.tuftden test_gc2 = new ThetaStim(0.5) // stimulate granule cell synapse directly
objref test_nc2
test_nc2 = new NetCon(test_gc2, gc1_m1_glut)
nclist.append(test_nc)
nclist.append(test_nc2)
// end test section
*/
/////////////////////////////////////////////////////
//
// Graphical control of VecStims
//
/////////////////////////////////////////////////////
objref breath_events_for_mc1, breath_events_for_mc2[n]
objref breath_poisson_rate_for_mc1, breath_poisson_rate_for_mc2[n]
proc generate_mc1_breath_events() {
breath_events_for_mc1 = gen_events(tstop, breathing_period, breath_gauss_center, breath_half_width, breath_peak_rate)
OSN1.play(breath_events_for_mc1)
breath_poisson_rate_for_mc1 = _poisson_rate // global vector set by gen_events
print "completed generating ",breath_events_for_mc1.size()," mc1 breath events"
}
proc generate_mc2_breath_events() { local i
for i=0, n-1 {
breath_events_for_mc2[i] = gen_events(tstop, breathing_period, breath_gauss_center, breath_half_width, breath_peak_rate)
OSN2[i].play(breath_events_for_mc2[i])
breath_poisson_rate_for_mc2[i] = _poisson_rate // global vector set by gen_events
print "completed generating ", breath_events_for_mc2[i].size()," m2[",i,"] breath events"
}
}
proc generate_breath_events() {
generate_mc1_breath_events()
generate_mc2_breath_events()
}
strdef stim_file_name
proc save_mc1_breath_events() { // writes a file
sprint(stim_file_name, "stimulation/breath_for_mc1_%f_%f_%f_%f_%f.dat",breathing_period, breath_gauss_center, breath_half_width, breath_peak_rate, tstop)
write_vec(stim_file_name, breath_events_for_mc1)
}
proc save_mc2_breath_events() { // writes a file
sprint(stim_file_name, "stimulation/breath_for_mc2_%f_%f_%f_%f_%f.dat",breathing_period, breath_gauss_center, breath_half_width, breath_peak_rate, tstop)
write_vec(stim_file_name, breath_events_for_mc2)
}
proc save_breath_events() { // writes two files
save_mc1_breath_events()
save_mc2_breath_events()
}
chdir("py")
nrnpython("import utilities")
nrnpython("import os.path as path")
chdir("..")
objref p
p=new PythonObject()
proc load_mc1_breath_events() { // reads a file
sprint(stim_file_name, "stimulation/breath_for_mc1_%f_%f_%f_%f_%f.dat",breathing_period, breath_gauss_center, breath_half_width, breath_peak_rate, tstop)
breath_events_for_mc1=p.utilities.read_nrn_vec(stim_file_name)
OSN1.play(breath_events_for_mc1)
}
proc load_mc2_breath_events() { // reads a file
sprint(stim_file_name, "stimulation/breath_for_mc2_%f_%f_%f_%f_%f.dat",breathing_period, breath_gauss_center, breath_half_width, breath_peak_rate, tstop)
breath_events_for_mc2=p.utilities.read_nrn_vec(stim_file_name)
OSN2.play(breath_events_for_mc2)
}
proc load_breath_events() { // reads two files
load_mc1_breath_events()
load_mc2_breath_events()
}
objref light_events_for_mc1, light_events_for_mc2
objref light_poisson_rate_for_mc1, light_poisson_rate_for_mc2
proc generate_mc1_light_events() {
light_events_for_mc1 = gen_events(tstop, light_period, light_gauss_center, light_half_width, light1_peak_rate)
Light1.play(light_events_for_mc1)
light_poisson_rate_for_mc1 = _poisson_rate // global vector set by gen_events
print "completed generating ", light_events_for_mc1.size()," mc1 light events"
}
proc generate_mc2_light_events() {
light_events_for_mc2 = gen_events(tstop, light_period, light_gauss_center, light_half_width, light2_peak_rate)
Light2.play(light_events_for_mc2)
light_poisson_rate_for_mc2 = _poisson_rate // global vector set by gen_events
print "completed generating ",light_events_for_mc2.size()," mc2 light events"
}
proc generate_light_events() {
generate_mc1_light_events()
generate_mc2_light_events()
}
proc save_mc1_light_events() { // writes a file
sprint(stim_file_name, "stimulation/light_for_mc1_%f_%f_%f_%f_%f.dat",light_period, light_gauss_center, light_half_width, light1_peak_rate, tstop)
write_vec(stim_file_name, light_events_for_mc1)
}
proc save_mc2_light_events() { // writes a file
sprint(stim_file_name, "stimulation/light_for_mc2_%f_%f_%f_%f_%f.dat",light_period, light_gauss_center, light_half_width, light2_peak_rate, tstop)
write_vec(stim_file_name, light_events_for_mc2)
}
proc save_light_events() { // writes two files
save_mc1_light_events()
save_mc2_light_events()
}
proc load_mc1_light_events() { // writes a file that is
sprint(stim_file_name, "stimulation/light_for_mc1_%f_%f_%f_%f_%f.dat",light_period, light_gauss_center, light_half_width, light1_peak_rate, tstop)
light_events_for_mc1=p.utilities.read_nrn_vec(stim_file_name)
Light1.play(light_events_for_mc1)
}
proc load_mc2_light_events() { // writes a file that is
sprint(stim_file_name, "stimulation/light_for_mc2_%f_%f_%f_%f_%f.dat",light_period, light_gauss_center, light_half_width, light2_peak_rate, tstop)
light_events_for_mc2=p.utilities.read_nrn_vec(stim_file_name)
Light2.play(light_events_for_mc2)
}
proc load_light_events() { // writes a file that is
load_mc1_light_events()
load_mc2_light_events()
}
proc adjust_tstop() {
tstop=breathing_period*((breathing_period)/abs(breathing_period-light_period))+100
}
proc do_everything() {
print "Doing everything: load or regenerate input trains, run simulation, and store results in tdt2mat dir"
adjust_tstop() // tstop=breathing_period*((breathing_period)/abs(breathing_period-light_period))+100
print "First set tstop =",tstop," to accomdate all phase differences between breathing and light periods, plus arbitrary 100 ms"
// methodically check that each of the breath and light files (mc1 and mc2) (4 files total) are available
// breath for mc1
// breath for mc2
// light for mc1
// light for mc2
sprint(stim_file_name, "stimulation/breath_for_mc1_%f_%f_%f_%f_%f.dat",breathing_period, breath_gauss_center, breath_half_width, breath_peak_rate, tstop)
/* if (p.path.isfile(stim_file_name)) {
load_mc1_breath_events()
} else {
generate_mc1_breath_events()
save_mc1_breath_events()
}
*/
// for now always generate: (can add file writing for columns later if desired)
generate_mc1_breath_events() // always just generate the breath events
sprint(stim_file_name, "stimulation/breath_for_mc2_%f_%f_%f_%f_%f.dat",breathing_period, breath_gauss_center, breath_half_width, breath_peak_rate, tstop)
/* if (p.path.isfile(stim_file_name)) {
load_mc2_breath_events()
} else {
generate_mc2_breath_events()
save_mc2_breath_events()
}
*/
generate_mc2_breath_events() // always generate
sprint(stim_file_name, "stimulation/light_for_mc1_%f_%f_%f_%f_%f.dat",light_period, light_gauss_center, light_half_width, light1_peak_rate, tstop)
/* if (p.path.isfile(stim_file_name)) {
load_mc1_light_events()
} else {
generate_mc1_light_events()
save_mc1_light_events()
}
*/
generate_mc1_light_events() // always generate
sprint(stim_file_name, "stimulation/light_for_mc2_%f_%f_%f_%f_%f.dat",light_period, light_gauss_center, light_half_width, light2_peak_rate, tstop)
/*
if (p.path.isfile(stim_file_name)) {
load_mc2_light_events()
} else {
generate_mc2_light_events()
save_mc2_light_events()
}
*/
generate_mc2_light_events() // always generate
print "running simulation"
print "hide graphs for faster run"
init()
run()
print "saving tank"
save_tank()
print "Done everything!"
}
gc_connection_state=0
gc_on = 4 // can use for particular global levels of gc connectivity strength
proc toggle_gc_connection() {
if (gc_connection_state) {
for i=0, n-1 {
nc[2][i].weight = 0
nc[3][i].weight = 0
nc[4][i].weight = 0
nc[5][i].weight = 0
nc[10][i].weight = 0
nc[11][i].weight = 0
nc[12][i].weight = 0
nc[13][i].weight = 0
}
// automaticaly xstatebutton sets gc_connection_state=0
} else {
for i=0, n-1 {
nc[2][i].weight = gc_on
nc[3][i].weight = gc_on
nc[4][i].weight = gc_on
nc[5][i].weight = gc_on
nc[10][i].weight = gc_on
nc[11][i].weight = gc_on
nc[12][i].weight = gc_on
nc[13][i].weight = gc_on
}
// automatically xbuttonstate sets gc_connection_state=1
}
}
pg_connection_state=0
pg_on = 1 // can use for particular global levels of pg connectivity strength
proc toggle_pg_connection() {
if (pg_connection_state) {
for i=0, n-1 {
nc[14][i].weight = 0
nc[15][i].weight = 0
nc[16][i].weight = 0
nc[17][i].weight = 0
nc[18][i].weight = 0
nc[19][i].weight = 0
nc[20][i].weight = 0
nc[21][i].weight = 0
nc[22][i].weight = 0
nc[23][i].weight = 0
nc[24][i].weight = 0
nc[25][i].weight = 0
// xstatebutton automatically sets pg_connection_state=0
}
} else {
for i=0, i-1 {
nc[14][i].weight = pg_on
nc[15][i].weight = pg_on
nc[16][i].weight = pg_on
nc[17][i].weight = pg_on
nc[18][i].weight = pg_on
nc[19][i].weight = pg_on
nc[20][i].weight = pg_on
nc[21][i].weight = pg_on
nc[22][i].weight = pg_on
nc[23][i].weight = pg_on
nc[24][i].weight = pg_on
nc[25][i].weight = pg_on
// xstatebutton automatically sets pg_connection_state=1
}
}
}
objref hbox
hbox = new HBox()
hbox.intercept(1)
xpanel("Seperate BREATHING inputs generated for each of two mitral cells.")
xbutton("tstop=breathing_period*((breathing_period)/abs(breathing_period-light_period))+100","{ adjust_tstop() tstop_changed() }")
// what the formula does above is compute how long the simulation needs to run to allow the breathing period and light
// period to completly overlap and then adds 100 ms for good measure.
xvalue("Tstop","tstop", 1,"tstop_changed()", 0, 1 ) // from standard run control window
xlabel("Far above sets tstop. Below OSN breathing input gauss. params. for mc1, mc2")
xlabel("The breath period in milliseconds (ms):")
xvalue("breathing_period")
xlabel("The number of ms from the start of a breath to the peak fr:")
xvalue("breath_gauss_center")
xlabel("The half width of the gaussian:")
xvalue("breath_half_width")
xlabel("max firing rate")
xvalue("breath_peak_rate")
xbutton("regenerate and save breath event trains","{ generate_breath_events() save_breath_events() }")
//xbutton("load stimulation file into breath events","load_breath_events()") // These will read or save breath events in a
//xbutton("save breath events as stimulation","save_breath_events()") // reusable format in the stimulation folder
xlabel(" - - - - - - - - -")
xlabel("LIGHT input to both mitral cells")
xlabel("Light input gaussian parameters for mitral cell 1 and 2:")
xlabel("parameters are shared except for lightX_peak_rate")
xlabel("The light period in milliseconds (ms):")
xvalue("light_period")
xlabel("ms from the start of a light period to the peak fr:")
xvalue("light_gauss_center")
xlabel("The half width of the gaussian:")
xvalue("light_half_width")
xlabel("max firing rates (0 is off)")
xvalue("light1_peak_rate")
xvalue("light2_peak_rate")
xbutton("regenerate light input trains","{ generate_light_events() save_light_events() }")
// xbutton("load stimulation file into light events","load_light_events()") // These will read or save breath events in a
// xbutton("save light events as stimulation","save_light_events()") // reusable format in the stimulation folder
xbutton("Everything!: regenerate any missing input events/run sim/store","do_everything()")
xpanel()
global_weight=1
//xvalue("prompt", "variable" [, boolean_deflt, "action" [, boolean_canrun, boolean_usepointer]])
//xvalue("global_weight","global_weight",2,"readjust_weights()",1, 0)
xpanel("Synapse weights")
xlabel("Synapse weights")
xvalue("global_weight")
xbutton("readjust_weights()")
xlabel("OSN1 (breath1)->m1:")
xvalue("nc[0][0].weight")
xlabel("OSN2 (breath2)->m2:")
xvalue("nc[1][0].weight")
// background stimulation panel
xlabel("background1 and 2")
xlabel("background input to mitral cell 1:")
xvalue("background1[0].interval")
xvalue("background1[0].start")
xvalue("background1[0].number")
xvalue("background1[0].noise")
// assign some default values
background1[0].interval=100 // mean synaptic period in ms
background1[0].start=25
background1[0].number=0 // 1e9 // (forever)
background1[0].noise=1 // completely noisy
xlabel("background input to mitral cell 2:")
xvalue("background2[0].interval")
xvalue("background2[0].start")
xvalue("background2[0].number")
xvalue("background2[0].noise")
// assign some default values
background2[0].interval=100
background2[0].start=25
background2[0].number=0 // 1e9 // (forever)
background2[0].noise=1 // completely noisy
xlabel("Below graphs stimulation events and poisson")
xlabel("Note: poisson rates not shown to scale")
xbutton("red - breath, purple-light","{graph_poisson()}") // see graph_fncs.hoc for details
xlabel("click below to save selected data or save tank")
xbutton("save event and voltage data","write_selected_vecs()")
xbutton("save simulation to tank","save_tank()")
xpanel()
xpanel("connections that involve gc cells")
xlabel("m1 to gc:")
xvalue("nc[2][0].weight")
xlabel("gc1 back to m1:")
xvalue("nc[3][0].weight")
xlabel("m2 to gc1")
xvalue("nc[4][0].weight")
xlabel("gc1 back to m2")
xvalue("nc[5][0].weight")
xlabel("m1 to gc2")
xvalue("nc[10][0].weight")
xlabel("gc2 to m1")
xvalue("nc[11][0].weight")
xlabel("m2 to gc2")
xvalue("nc[12][0].weight")
xlabel("gc2 to m2")
xvalue("nc[13][0].weight")
xstatebutton("toggle gc cell connection", &gc_connection_state, "toggle_gc_connection()")
xlabel(" ")
xlabel(" - - - - - - - - ")
xlabel(" ")
xbutton("Set weights, etc. from 0th column to all columns","adjust_netcons_from_top()")
xpanel()
// pg cell panel
xpanel("connections to/from pg cells")
xlabel(" pg1 ")
xlabel("background1(14), OSN1(15), and Light1(16) to pg1")
xvalue("nc[14][0].weight")
xvalue("nc[15][0].weight")
xvalue("nc[16][0].weight")
xlabel("recip syn m1 tuft->pg1(17),<-(18)")
xvalue("nc[17][0].weight")
xvalue("nc[18][0].weight")
xlabel("pg1 axon->m2 priden")
xvalue("nc[25][0].weight")
xlabel(" pg2 ")
// all the connections to periglom 2:
// excited by background, OSN2, Light2, mitral cell 2
// output inhibits mitral cell 2 with dendro-dendritic reciprocal synapse
// and inhibits mitral cell 1 with axonal synapse
xlabel("background2(20), OSN2(21), and Light2(22) to pg2")
xvalue("nc[20][0].weight")
xvalue("nc[21][0].weight")
xvalue("nc[22][0].weight")
xlabel("m2 tuft->pg2(23),<-(24)")
xvalue("nc[23][0].weight")
xvalue("nc[24][0].weight")
xlabel("pg2 axon->m1 priden")
xvalue("nc[19][0].weight")
xstatebutton("toggle pg cell connection", &pg_connection_state, "toggle_pg_connection()")
xpanel()
// note that background omitted in the below because ended up not using it in simulations
// before the et cells were added
xpanel("connections to/from et cells")
xlabel(" et1 ")
xlabel("Light1(26), OSN1(27) to et1")
xvalue("nc[26][0].weight")
xvalue("nc[27][0].weight")
xlabel("et1 axon->m1 tuft")
xvalue("nc[28][0].weight")
xlabel("token connections to/from column replicated") // just the [0]'th connection is editable/displayed
// the zeroth is all there is if there is 1 additional columns however if there are more than 2 total columns
// then the weights of those greater the 1 additional columns are not displayed/editable in this xpanel
xlabel("et1 axon -> pg1[i] dends")
xvalue("nc[29][0].weight")
xlabel("Light2[i] -> et2 tuft[i]")
xvalue("nc[30][0].weight")
xlabel("OSN2[i] -> et2 tuft[i]")
xvalue("nc[31][0].weight")
xlabel("et2 axon[i] -> m2 tuft[i]")
xvalue("nc[32][0].weight")
xlabel("et2 axon[i]->pg2 tuft[i]")
xvalue("nc[33][0].weight")
xpanel()
/*
// spacer so scroll bars are OK in other panels
for i=1,10 {
xlabel(" ")
}
*/
hbox.intercept(0)
hbox.map()
/////////////////////////////////////////////////////
//
// Setup vector and event recording for graphing/analysis
//
/////////////////////////////////////////////////////
objref t_vec, m1_v_vec, m2_v_vec
t_vec = new Vector()
m1_v_vec = new Vector()
m2_v_vec = new Vector()
t_vec.record(&t)
m1_v_vec.record(&m1.soma.v(0.5))
m2_v_vec.record(&m2.soma.v(0.5))
// create vectors to record synaptic events of the inputs and between cells
objref light1_events, light2_events[i]
objref OSN1_events, OSN2_events[i], m1_events, m2_events[i], gc1_events1[i], gc1_events2[i]
objref gc2_events1[i], gc2_events2[i] // from gc2 to mc1 and mc2 respectively
OSN1_events = new Vector()
m1_events = new Vector()
light1_events = new Vector()
for i=0, n-1 {
OSN2_events[i] = new Vector()
m2_events[i] = new Vector()
gc1_events1[i] = new Vector()
gc1_events2[i] = new Vector()
light2_events[i] = new Vector()
gc2_events1[i] = new Vector()
gc2_events2 [i]= new Vector()
}
nc[2][0].record(m1_events)
nc[0][0].record(OSN1_events)
nc[6][0].record(light1_events)
for i=0, n-1 {
nc[1][i].record(OSN2_events[i])
nc[3][i].record(gc1_events1[i]) // source position gc_recip_pos1 on granule priden2[0]
nc[4][i].record(m2_events[i])
nc[5][i].record(gc1_events2[i]) // source position gc_recip_pos2 on granule priden2[0]
nc[7][i].record(light2_events[i]) //for these connects the events are recorded into vectors here
nc[11][i].record(gc2_events1[i])
nc[13][i].record(gc2_events2[i])
}
// activate all the synapses
proc readjust_weights() {
for i=0,nclist.count-1 {
nclist.o[i].weight=global_weight
}
}
readjust_weights()
// test_nc.weight=global_weight
// test_nc2.weight=global_weight
proc adjust_netcons_from_top() {
// procedure will set appropriate netcons[X][Y>0} from netcons[X][0]
for i=0, num_of_netcon_types-1 {
if ((i!=0)&&(i!=6)&&(i!=8)) {
for j=0, n-1 { //extend the values into all the columns from the first column
nc[i][j].weight = nc[i][0].weight
nc[i][j].threshold = nc[i][0].threshold
nc[i][j].delay = nc[i][0].delay
}
}
}
}
load_file("cells_volt_graphs.ses")
load_file("runcntrl.ses")
load_file("graph_fncs.hoc")
// moved below to parameters_dot_hoc file so that pg recording objects are
// defined: load_file("tdt2mat_data.hoc")
// for the NSG this filename which looks like "run_X/parameters.hoc" was
// set in init.py. The contents of parameters.hoc was set by pre_init.py
/// print "parameters_dot_hoc_file=",parameters_dot_hoc_file
/// system("pwd; echo above before load_file parameters_dot ")
load_file(parameters_dot_hoc_file) // set parameters for a batch run of the job