// build_net_theta.hoc // builds simple model // OSN input goes to two mitral cells // which are connected to a granule cell load_file("mct_cells.hoc") // loads the McTavish cell templates Mitral and Granule objref m1, m2, gc1, gc2, pg1, pg2 m1 = new Mitral() m2 = new Mitral() gc1 = new Granule() gc2 = new Granule() pg1 = new PGcell(0) // the number 0 passed to PGcell() is the nicot. current pg2 = new PGcell(0) // the number 0 passed to PGcell() is the nicot. current // OSNXs will be representing breathing OSN activity while LightXs are repr. of light // stim. OSN activity (events) objref OSN1, OSN2, Light1, Light2 // Located arbitrarily because where they have an // effect is determined by the NetCon. m1.tuftden OSN1 = new ThetaStim(0.5) m1.tuftden OSN2 = new ThetaStim(0.5) m1.tuftden Light1 = new ThetaStim(0.5) m1.tuftden Light2 = new ThetaStim(0.5) // backgroundX is representative of background activity that causes mitral cell spiking // at any phase of the breath cycle objref background1, background2 m1.tuftden background1 = new NetStim(0.5)//Unsure if we need this after //you implement the gaussian firing rates to the light and breath stimuli m1.tuftden background2 = new NetStim(0.5) // introduce synapses so they can be targets in NetCons: // name convention: // cell name of post synaptic partner _ cell name of pre synaptic partner _ synapse type objref m1_osn_glut, m2_osn_glut // excitation of mitral tufts by osn cells objref m1_gc1_inhib, m2_gc1_inhib // inhibition of mitral dends by gc objref m1_gc2_inhib, m2_gc2_inhib // inhibition of mitral dends by gc2 objref gc1_m1_glut, gc1_m2_glut // excitation of gc by mitral cells objref pg1_glut, pg2_glut // excitation of peri-glom cells by osn, mitral cells, light, background objref gc2_m1_glut, gc2_m2_glut objref m1_inhib, m2_inhib // inhibition in the mitral cell tufts by both the local (same number // as mitral cell) objref m1priden_inhib, m2priden_inhib // and the remote pg cell (different number than mitral cell) tuft_excite_pos = 0.5 m1.tuftden m1_osn_glut = new AmpaNmda(tuft_excite_pos) m2.tuftden m2_osn_glut = new AmpaNmda(tuft_excite_pos) // the two below MC GC positions are reused for m1, m2, gc1, gc2 mc_gc_close_recip_pos = 0.05 mc_gc_far_recip_pos=.75 m1.secden m1_gc1_inhib = new FastInhib(mc_gc_close_recip_pos) m1.secden m1_gc2_inhib = new FastInhib(mc_gc_far_recip_pos) m2.secden m2_gc1_inhib = new FastInhib(mc_gc_far_recip_pos) m2.secden m2_gc2_inhib = new FastInhib(mc_gc_close_recip_pos) gc_recip_pos1 = 0.55 gc_recip_pos2 = 0.65 gc1.priden2 gc1_m1_glut = new AmpaNmda(gc_recip_pos1) gc1.priden2 gc1_m2_glut = new AmpaNmda(gc_recip_pos2) gc2.priden2 gc2_m1_glut = new AmpaNmda(gc_recip_pos2) gc2.priden2 gc2_m2_glut = 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 m1.tuftden m1_inhib = new FastInhib(tuft_inhib_pos) m2.tuftden m2_inhib = new FastInhib(tuft_inhib_pos) priden_inhib_pos = 0.9 m1.priden m1priden_inhib = new FastInhib(priden_inhib_pos) m2.priden m2priden_inhib = new FastInhib(priden_inhib_pos) // pg cell excitatory synapse part of reciprocal synapses and site of OSN input pg1.gemmbody pg1_glut = new AmpaNmda(0.5) // put in middle of pg spine pg2.gemmbody pg2_glut = new AmpaNmda(0.5) // put in middle of pg spine ///////////////////////////////////////////////////// // // connect the network // ///////////////////////////////////////////////////// // Connect the ThetaStims (OSN's) to the mc's objref nc[26] objref nclist nclist = new List() // connect the OSNs to the mcs nc[0] = new NetCon(OSN1, m1_osn_glut, 0, 1, 1) // arguments are source, target, threshold, delay, weight nc[1] = new NetCon(OSN2, m2_osn_glut) // connect the Lights to the mcs nc[6] = new NetCon(Light1, m1_osn_glut, 0, 1, 1) // arguments are source, target, threshold, delay, weight nc[7] = new NetCon(Light2, m2_osn_glut) // connect the reciprocal synapse between m1 and gc1 m1.secden[0] {nc[2] = new NetCon(&v(mc_gc_close_recip_pos), gc1_m1_glut, -20, 1, 1)} gc1.priden2[0] nc[3] = new NetCon(&v(gc_recip_pos1), m1_gc1_inhib) // connect the reciprocal synapse between m2 and gc1 m2.secden[0] nc[4] = new NetCon(&v(mc_gc_far_recip_pos), gc1_m2_glut) gc1.priden2[0] nc[5] = new NetCon(&v(gc_recip_pos2), m2_gc1_inhib) // connect the reciprocal synapse between m1 and gc2 m1.secden[0] {nc[10] = new NetCon(&v(mc_gc_far_recip_pos), gc2_m1_glut, -20, 1, 1)} gc2.priden2[0] nc[11] = new NetCon(&v(gc_recip_pos2), m1_gc2_inhib) // connect the reciprocal synapse between m2 and gc2 m2.secden[0] nc[12] = new NetCon(&v(mc_gc_close_recip_pos), gc2_m2_glut) gc1.priden2[0] nc[13] = new NetCon(&v(gc_recip_pos1), m2_gc2_inhib) // connect the background stimulus nc[8] = new NetCon(background1, m1_osn_glut, 0, 1, 1) // arguments are source, target, threshold, delay, weight nc[9] = new NetCon(background2, m2_osn_glut) // 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 nc[14] = new NetCon(background1, pg1_glut) nc[15] = new NetCon(OSN1, pg1_glut) nc[16] = new NetCon(Light1, pg1_glut) m1.tuftden nc[17] = new NetCon(&v(0.5), pg1_glut) pg1.gemmbody nc[18] = new NetCon(&v(0.5), m1_inhib) pg2.soma nc[19] = new NetCon(&v(0.5), m1priden_inhib) // 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] = new NetCon(background2, pg2_glut) nc[21] = new NetCon(OSN2, pg2_glut) nc[22] = new NetCon(Light2, pg2_glut) m2.tuftden nc[23] = new NetCon(&v(0.5), pg2_glut) pg2.gemmbody nc[24] = new NetCon(&v(0.5), m2_inhib) pg1.soma nc[25] = new NetCon(&v(0.5), m2priden_inhib) for i=0,25 { nclist.append(nc[i]) } ///////////////////////////////////////////////////// // // 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 ThetaStims // ///////////////////////////////////////////////////// objref hbox hbox = new HBox() hbox.intercept(1) xpanel("ThetaStim[0] and [2]") xlabel("OSN breathing input to mitral cell 1:") xvalue("ThetaStim[0].outer_interval") xvalue("ThetaStim[0].outer_start") xvalue("ThetaStim[0].outer_number") xvalue("ThetaStim[0].outer_noise") xvalue("ThetaStim[0].interval") xvalue("ThetaStim[0].start") xvalue("ThetaStim[0].number") xvalue("ThetaStim[0].noise") // assign some default values ThetaStim[0].outer_interval=400 ThetaStim[0].outer_start=25 ThetaStim[0].outer_number=400 ThetaStim[0].outer_noise=0 ThetaStim[0].interval=14 // 14 ms about 70 Hz, 25 ms is 40 Hz ThetaStim[0].start=25 ThetaStim[0].number=12 ThetaStim[0].noise=0.2 xlabel("Light input to mitral cell 1:") xvalue("ThetaStim[2].outer_interval") xvalue("ThetaStim[2].outer_start") xvalue("ThetaStim[2].outer_number") xvalue("ThetaStim[2].outer_noise") xvalue("ThetaStim[2].interval") xvalue("ThetaStim[2].start") xvalue("ThetaStim[2].number") xvalue("ThetaStim[2].noise") xlabel(" ") // vertical space to show bottom of last panel // assign some default values ThetaStim[2].outer_interval=399 ThetaStim[2].outer_start=25 ThetaStim[2].outer_number=401 ThetaStim[2].outer_noise=0 ThetaStim[2].interval=25 ThetaStim[2].start=25 ThetaStim[2].number=5 ThetaStim[2].noise=0.05 xpanel() xpanel("ThetaStim[1] and [3]") xlabel("OSN breathing input to mitral cell 2:") xvalue("ThetaStim[1].outer_interval") xvalue("ThetaStim[1].outer_start") xvalue("ThetaStim[1].outer_number") xvalue("ThetaStim[1].outer_noise") xvalue("ThetaStim[1].interval") xvalue("ThetaStim[1].start") xvalue("ThetaStim[1].number") xvalue("ThetaStim[1].noise") ThetaStim[1].outer_interval=400 ThetaStim[1].outer_start=25 ThetaStim[1].outer_number=400 ThetaStim[1].outer_noise=0 ThetaStim[1].interval=14 // 14 ms about 70 Hz, 25 ms is 40 Hz ThetaStim[1].start=25 ThetaStim[1].number=12 ThetaStim[1].noise=0.2 xlabel("Light input to mitral cell 2:") xvalue("ThetaStim[3].outer_interval") xvalue("ThetaStim[3].outer_start") xvalue("ThetaStim[3].outer_number") xvalue("ThetaStim[3].outer_noise") xvalue("ThetaStim[3].interval") xvalue("ThetaStim[3].start") xvalue("ThetaStim[3].number") xvalue("ThetaStim[3].noise") xlabel(" ") // vertical space to show bottom of last panel // assign some default values ThetaStim[3].outer_interval=0 ThetaStim[3].outer_start=0 ThetaStim[3].outer_number=0 ThetaStim[3].outer_noise=0 ThetaStim[3].interval=0 ThetaStim[3].start=0 ThetaStim[3].number=0 ThetaStim[3].noise=0 xpanel() /*xlabel("test gc belo ") xvalue("ThetaStim[2].interval") xvalue("ThetaStim[2].start") xvalue("ThetaStim[2].number") xvalue("ThetaStim[2].noise") xlabel("test gc2 belo ") xvalue("ThetaStim[3].interval") xvalue("ThetaStim[3].start") xvalue("ThetaStim[3].number") xvalue("ThetaStim[3].noise") */ 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 (ThetaStim[1])to m1:") xvalue("nc[0].weight") xlabel("OSN2 (ThetaStim[1]) to m2:") xvalue("nc[1].weight") xlabel("m1 to gc:") xvalue("nc[2].weight") xlabel("gc1 back to m1:") xvalue("nc[3].weight") xlabel("m2 to gc") xvalue("nc[4].weight") xlabel("gc1 back to m2") xvalue("nc[5].weight") xlabel("m1 to gc2") xvalue("nc[9].weight") xlabel("m2 to gc2") xvalue("nc[10].weight") xlabel("click below to graph stimulations") xbutton("light(green) breath1(orange) breath2(purple)","{regraph_stims()}") 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() // background stimulation panel xpanel("background1 and 2") xlabel("background input to mitral cell 1:") xvalue("background1.interval") xvalue("background1.start") xvalue("background1.number") xvalue("background1.noise") // assign some default values background1.interval=100 // mean synaptic period in ms background1.start=25 background1.number=1e9 // (forever) background1.noise=1 // completely noisy xlabel("background input to mitral cell 2:") xvalue("background2.interval") xvalue("background2.start") xvalue("background2.number") xvalue("background2.noise") // assign some default values background2.interval=100 background2.start=25 background2.number=1e9 // (forever) background2.noise=1 // completely noisy // spacer so scroll bars are OK in other panels for i=1,10 { xlabel(" ") } xpanel() 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)) objref light1_events, light2_events objref OSN1_events, OSN2_events, m1_events, m2_events, gc1_events1, gc1_events2 OSN1_events = new Vector() OSN2_events = new Vector() m1_events = new Vector() m2_events = new Vector() gc1_events1 = new Vector() gc1_events2 = new Vector() light1_events = new Vector() light2_events = new Vector() nc[0].record(OSN1_events) nc[1].record(OSN2_events) nc[2].record(m1_events) nc[3].record(gc1_events1) // source position gc_recip_pos1 on granule priden2[0] nc[4].record(m2_events) nc[5].record(gc1_events2) // source position gc_recip_pos2 on granule priden2[0] nc[6].record(light1_events) nc[7].record(light2_events) //for these connects the events are recorded into vectors here // activate all the synapses proc readjust_weights() { for i=0,nclist.count-1 { nc[i].weight=global_weight } } readjust_weights() // test_nc.weight=global_weight // test_nc2.weight=global_weight load_file("cells_volt_graphs.ses") load_file("run_cntrl.ses") load_file("graph_fncs.hoc") load_file("tdt2mat_data.hoc")