Posting this as a separate query as it was on a different note to the one I posted earlier. I have been trying to extend the NMODL code for implementing a gap junction (as given in the NEURON book) to have both a resistive and capacitive component (i.e. a gap junction represented as a resistor and capacitor in parallel). For starters, I went through ModelDB for gap junctions implemented via NMODL but it turned out they were all purely resisitive. The NEURON forum also failed to return any results on the same and so I decided to have a hand at it.
At the very basic, I believe the significant change (to the gap junction code in the NEURON book) would be change the current calculation equation from:
Code: Select all
i = (v - vgap)/r
Code: Select all
i = ((v - vgap)/r) + ( (d(v - vgap)/dt) * Cj)
Now I was having a bit of trouble trying to calculate dv/dt in NMODL. Then I came across this post: http://www.neuron.yale.edu/phpbb/viewto ... =16&t=2146. I had my doubts whether I could use that exact same approach of calculating dv/dt = 1000*i_cap/cm. But for lack of a better alternative, I went ahead with it and this what I ended up with:
Code: Select all
NEURON {
POINT_PROCESS Gap
POINTER vgap, icap1, icap2 : 1 = same cell, 2 = other cell
RANGE r, i, dv1dt, dv2dt, cm, Cj : 1 = same cell, 2 = other cell
NONSPECIFIC_CURRENT i
}
PARAMETER {
r = 1e10 (megohm) : Gap Junctional Coupling Resistance
Cj = 1000 (picofarad) : Gap Junctional Coupling Capacitance
}
ASSIGNED {
v (millivolt)
vgap (millivolt)
i (nanoamp)
icap1 (milliamp/cm2) : 1 = same cell
icap2 (milliamp/cm2) : 2 = other cell
cm (microfarad/cm2)
dv1dt (millivolt/ms) : 1 = same cell
dv2dt (millivolt/ms) : 2 = other cell
}
INITIAL {
dv1dt = (1000)*icap1/cm : 1 = same cell
dv2dt = (1000)*icap2/cm : 2 = other cell
}
BREAKPOINT {
dv1dt = (1000)*icap1/cm : 1 = same cell
dv2dt = (1000)*icap2/cm : 2 = other cell
i = ((v - vgap)/r) + ((dv1dt-dv2dt)*Cj)
}
UNITSON
Code: Select all
create cella, cellb
access cella
objref g[2]
for i = 0 ,1 {
g[i] = new Gap(0.5)
g[i].r = 33.3
}
cella g[0].loc(0.9999)
cellb g[1].loc(0.0001)
g[0].cm = cella.cm(0.9999)
g[1].cm = cellb.cm(0.0001)
setpointer g[0].icap1, cella.i_cap(0.9999)
setpointer g[1].icap1, cellb.i_cap(0.0001)
setpointer g[0].icap2, cellb.i_cap(0.0001)
setpointer g[1].icap2, cella.i_cap(0.9999)
setpointer g[0].vgap, cellb.v(0.0001)
setpointer g[1].vgap, cella.v(0.9999)
If I were to jot down my questions:
1> Is the basic equation that I stated at the outset correct?
2> Would it be right to implement dv/dt = 1000*i_cap/cm here? I am a bit doubtful as, I believe, i_cap is dependent on only cm and Cj is not coming into the picture anywhere in its calculation.
3> On a broader level, what would be the correct/better method to implement this in NMODL as a point process? Any tips or pointers?
Thanks,
Shailesh Appukuttan