In this example, we show using rxd to handle the kinetics of a mGLUR. In NEURON 7.7, we still need a brief MOD file to detect the synaptic event.
The Python code
from neuron import h, rxd from matplotlib import pyplot h.load_file('stdrun.hoc') #Paramters from https://SenseLab.med.yale.edu/ModelDB/ShowModel.cshtml?model=185858&file=/CaHDemo/mglur.mod#tabs-2 # species concentrations are in uM like the mod file rather than the standard mM initmGluR =0.3e-3 #Bhalla & Iyenger Science 1999 K1 = 0.28 # forward binding rate to receptor from Bhalla et al K2 = 0.016 # backward (unbinding) rate of receptor from Bhalla et al K_PLC = 5 # total concentration of PLC K_PIP2 = 160 # total concentration of PIP2 K_G=25 # #kplc and Vmax describe aPLC catalyzing IP3 production from PIP2 kfplc = 0.83 kbplc = 0.68 #0.1/ms in the paper; added to Vmax1=0.58/ms in the paper Vmax1 = 0.58 #D5 and D6 describe Glu_mGluR catalyzing G_alpha production, Km2=(D6f+D5B)/D5f D5f = 15 D5b = 7.2 D6f = 1.8 #G2 describe aG binding to PLC G2f = 100 G2b = 100 #degradation of aG (D7f) and IP3 (G9f) D7f = 9 degGluRate = 1.0 # should lookup value # Spine Head head = h.Section(name='head') head.nseg = 1 head_L = 0.8 #um head_d = 0.8 #um h.pt3dadd(0, 0, 0, head_d, sec=head) h.pt3dadd(0, 0, head_L, head_d, sec=head) glu_per_spike = 1000 # number of molecules (arbitrarily choice for this example) # RxD spine_head = rxd.Region([head],nrn_region='i') Glu = rxd.Species(spine_head,name="Glu",initial=0) mGluR = rxd.Species(spine_head,name="mGluR",initial=initmGluR) Glu_mGluR = rxd.Species(spine_head,name="Glu_mGluR",initial=0) react1 = rxd.Reaction(Glu + mGluR, Glu_mGluR,K1,K2) degGlu = rxd.Species(spine_head,name="degGlu",initial=0) react2 = rxd.Reaction(Glu, degGlu,degGluRate) G = rxd.Species(spine_head,name="G",initial=K_G) GG_mGluR = rxd.Species(spine_head,name="GG_mGluR",initial=0) react3 = rxd.Reaction(Glu_mGluR + G, GG_mGluR,D5f,D5b) aG = rxd.Species(spine_head,name="aG",initial=0) react4 = rxd.Reaction(GG_mGluR, aG + mGluR,D6f) react5 = rxd.Reaction(aG, G,D7f) PLC = rxd.Species(spine_head,name="PLC",initial=K_PLC) aPLC_aG = rxd.Species(spine_head,name="aPLC_aG",initial=0) react6 = rxd.Reaction(aG + PLC, aPLC_aG, G2f, G2b) PIP2 = rxd.Species(spine_head,name="PIP2",initial=K_PIP2) aPLC_PIP2 = rxd.Species(spine_head,name="aPLC_PIP2",initial=0) react7 = rxd.Reaction(aPLC_aG+PIP2, aPLC_PIP2,kfplc,kbplc) ip3 = rxd.Species(spine_head,name="ip3",d=1.415,initial=0) react8 = rxd.Reaction(aPLC_PIP2,ip3 ,Vmax1) #ip3 degradation has been omitted in this example # Add the synapse syn = h.mGLURRxD(head(0.5)) # Connect the RxD concentration with the point process h.setpointer(Glu.nodes[0]._ref_concentration,'G',syn) # Noisy stimulation h.Random(6324) stim = h.NetStim() stim.number = 100 stim.start = 0 stim.noise = 1 ncstim = h.NetCon(stim, syn) ncstim.delay = 1 ncstim.weight[0] = glu_per_spike/(Glu.nodes[0].volume) # number per um^3 # Record tvec = h.Vector() tvec.record(h._ref_t) Glu_vec = h.Vector() Glu_vec.record(head(0.5)._ref_Glui) ip3_vec = h.Vector() ip3_vec.record(head(0.5)._ref_ip3i) # Run simulation h.finitialize() h.continuerun(1000) # Plot the result pyplot.subplot(2,1,1) pyplot.plot(tvec,Glu_vec) pyplot.xlabel("t (ms)") pyplot.ylabel("Glu (uM)") pyplot.subplot(2,1,2) pyplot.plot(tvec,ip3_vec.mul(1e3)) pyplot.xlabel("t (ms)") pyplot.ylabel("IP3 (nM)")
The synaptic event detection code
NEURON { POINT_PROCESS mGLURRxD POINTER G } UNITS { CON = (1/micrometer3) (millimole/m3) : count/volume to uM } ASSIGNED { G } NET_RECEIVE (weight) { G = G + weight * CON }