nmj junctional folds

The basics of how to develop, test, and use models.
Post Reply
jdilger
Posts: 2
Joined: Mon Apr 21, 2014 1:39 pm

nmj junctional folds

Post by jdilger »

I'd like to model the muscle side of the neuromuscular junction (yeah, I know the program's called Neuron, not Muscle). The postsynaptic fold might be considered as a rounded rectangle extending into the muscle cell about 1 µm and stretching 2 µm by 0.1 µm along the surface of the membrane. In short - not a cylinder. Neuron, the program, is based on cylindrical cables (length L, diameter d). I think (correct me if I'm wrong), that the membrane potential is considered to be the same at all points in a cross-sectional area of the cable. So, Neuron is not really equipped to model my situation. Is this true? In more detail, if I inject current somewhere near the top of a fold, I'd like to know V(x,y,z,t) throughout the fold. If Neuron cannot do this, do you know of another platform that might be able to model this?

Thanks!
ted
Site Admin
Posts: 6302
Joined: Wed May 18, 2005 4:50 pm
Location: Yale University School of Medicine
Contact:

Re: nmj junctional folds

Post by ted »

First, my intuition tells me that a 1 dimensional cable should be sufficient to take care of this--that is, if x is distance from cell surface into the fold, there won't be significant variation of potential in the y or z direction--at least, not if channel densities are reasonably uniform in the y and z direction. Also, unless current density is enormous, there won't be much variation of potential along the x direction either. It should be possible to make a worst case estimate of the maximum voltage drop that is to be expected, given the dimensions of a fold, resistivity of extracellular fluid, peak NMJ current, and the fraction of total NMJ current that flows through the membrane that lines a fold. Worth doing before going to the trouble of setting up a computational model.

The extracellular class can be used to implement a model that closely approximates the physical situation. To see how, consider this cartoon which is meant to represent the geometry of the muscle membrane at the location of a postsynaptic fold:

Code: Select all

          |
          |
          +----------------------+
                                 |         
           extracellular channel |
                                 |
          +----------------------+
          |
          |
outside   ^   inside
      membrane
Here's the equivalent circuit for what you get if you insert extracellular into a section

Code: Select all

          Ra		
o/`--o--'\/\/`--o--'\/\/`--o--'\/\/`--o--'\o vext + v
     |          |          |          |     
    ---        ---        ---        ---     cm and ion channels
   |   |      |   |      |   |      |   |    in parallel
    ---        ---        ---        ---
     |  xraxial |          |          |
o/`--o--'\/\/`--o--'\/\/`--o--'\/\/`--o--'\ vext
     |          |          |          |     
    ---        ---        ---        ---     xc and xg
   |   |      |   |      |   |      |   |    in  parallel
    ---        ---        ---        ---
     |xraxial[1]|          |          |     
o/`--o--'\/\/`--o--'\/\/`--o--'\/\/`--o--'\ vext[1]
     |          |          |          |     
    ---        ---        ---        ---     the series xg[1], e_extracellular
   |   |      |   |      |   |      |   |    combination is in parallel with
   |  ---     |  ---     |  ---     |  ---   the xc[1] capacitance. This is
   |   -      |   -      |   -      |   -    identical to a membrane with
    ---        ---        ---        ---     cm, g_pas, e_pas
     |          |          |          |     
-------------------------------------------- ground
xc, xg, and xraxial are all user-specifiable parameters of the extracellular mechanism.

Set xraxial[1] to 1e9 and all xg and xc to 1e-9, and this is equivalent to

Code: Select all

          Ra		
o/`--o--'\/\/`--o--'\/\/`--o--'\/\/`--o--'\o vext + v
     |          |          |          |     
    ---        ---        ---        ---     cm and ion channels
   |   |      |   |      |   |      |   |    in parallel
    ---        ---        ---        ---
     |  xraxial |          |          |
o/`--o--'\/\/`--o--'\/\/`--o--'\/\/`--o--'\ vext
which is almost what you want. Actually, you want the leftmost external node to be grounded, so set its xg[0] and xg[1] to 1e9. Also, you want Ra to be very small because, to a very good approximation, the potential inside the cell adjacent to the fold will be very nearly independent of position. Attach synaptic mechanisms to the internal nodes and there's your model cell.
jdilger
Posts: 2
Joined: Mon Apr 21, 2014 1:39 pm

Re: nmj junctional folds

Post by jdilger »

Thanks for quick reply!
I also thought that y-z variation would not be important, but I got concerned after running a simple model. A 0.1x1.0 µm fold at one end of a substantially larger muscle cell. Inject 100 pA at extracellular end of fold. Voltage falls to resting V at the point where fold meets muscle - 1 µm away. So, entire V drop occurs over 1 µm. If the y width of the fold is 2 µm, I would guess that including this would make a difference. But, I am really new at using Neuron, so I might be goofing up something. Here is the session file that recreates my scenario.

Code: Select all

{load_file("nrngui.hoc")}
objectvar save_window_, rvp_
objectvar scene_vector_[7]
objectvar ocbox_, ocbox_list_, scene_, scene_list_
{ocbox_list_ = new List()  scene_list_ = new List()}
{pwman_place(0,0,0)}

//Begin CellBuild[0]
{
load_file("celbild.hoc", "CellBuild")
}
{ocbox_ = new CellBuild(1)}
{object_push(ocbox_)}
{
version(5.7)
continuous = 1
}
{object_push(topol)}
{
first = 0
slist.remove_all()
sname = "fold"
objref tobj
}
{
tobj = new CellBuildSection("muscle",0, 0, tobj, 0) slist.append(tobj)
  tobj.position(0,0,15,0) tobj.lx=7.45543 tobj.ly=-14.1869 tobj.i3d=0
tobj = new CellBuildSection("fold",0, 0, tobj, 0) slist.append(tobj)
tobj.parent=slist.object(0)
  tobj.position(0,0,0,135) tobj.lx=-27.5527 tobj.ly=67.4987 tobj.i3d=0
all_init()
}
for i=0, slist.count-1 {slist.object(i).rdses()}
{object_pop()}
{
}
{object_push(subsets)}
{first = 0}
{ tobj = snlist.object(0)}
{consist()}
{object_pop()}
{
}
{object_push(geom)}
{
first = 0
tobj = new GeoSpec(7)
tobj.value = 0.1
bild.subsets.snlist.object(0).geo.append(tobj)
tobj = new GeoSpec(2)
tobj.value = 1000
bild.topol.slist.object(0).geo.append(tobj)
tobj = new GeoSpec(3)
tobj.value = 6
bild.topol.slist.object(0).geo.append(tobj)
tobj = new GeoSpec(2)
tobj.value = 1
bild.topol.slist.object(1).geo.append(tobj)
tobj = new GeoSpec(3)
tobj.value = 0.1
bild.topol.slist.object(1).geo.append(tobj)
set_default()
}
{object_pop()}
{
}
{object_push(memb)}
{first=0}
{
tobj = new FakeMechStan(0)
tobj.value = 125
tobj.set_default()
tobj = new MStanWrap(tobj, 0)
bild.subsets.snlist.object(0).ml.append(tobj)
}
{
tobj = new FakeMechStan(1)
tobj.value = 1
tobj.set_default()
tobj = new MStanWrap(tobj, 0)
bild.subsets.snlist.object(0).ml.append(tobj)
}
{
tobj = new MechanismStandard("pas")
tobj.set("g_pas", 0.00133333, 0)
tobj.set("e_pas", -80, 0)
tobj = new MStanWrap(tobj, 1)
bild.subsets.snlist.object(0).ml.append(tobj)
}
{object_pop()}
{
}
{object_push(manage)}
{
first = 0
classname = "Cell"
etop=1 esub=1 egeom=1 emem=1
itop=1 isub=0 igeom=0 imem=0
bild.topol.names_off = 0
bild.topol.circles_off = 0
output_index = 0  output_x = 1
thresh = 10
}
{object_pop()}
{
cexport()
}
{object_pop()}
{
save_window_=ocbox_.gtopol
save_window_.size(-200,200,-150,150)
scene_vector_[2] = save_window_
ocbox_.gtopol = save_window_
save_window_.save_name("ocbox_.gtopol")
}
{
ocbox_.map("CellBuild[0]", 521, 2, 766.08, 374.4)
}
objref ocbox_
//End CellBuild[0]


//Begin PointProcessManager
{
load_file("pointman.hoc")
}
{
fold ocbox_ = new PointProcessManager(0)
}
{object_push(ocbox_)}
{
mt.select("IClamp") i = mt.selected()
ms[i] = new MechanismStandard("IClamp")
ms[i].set("del", 1, 0)
ms[i].set("dur", 1.2, 0)
ms[i].set("amp", 0.1, 0)
mt.select("AlphaSynapse") i = mt.selected()
ms[i] = new MechanismStandard("AlphaSynapse")
ms[i].set("onset", 0.5, 0)
ms[i].set("tau", 1, 0)
ms[i].set("gmax", 0.05, 0)
ms[i].set("e", 0, 0)
mt.select("IClamp") i = mt.selected() maction(i)
hoc_ac_ = 1
sec.sec move() d1.flip_to(0)
}
{object_pop() doNotify()}
{
ocbox_ = ocbox_.v1
ocbox_.map("PointProcessManager", 1284, 0, 365.76, 509.76)
}
objref ocbox_
//End PointProcessManager

{
xpanel("RunControl", 0)
v_init = -80
xvalue("Init","v_init", 1,"stdinit()", 1, 1 )
xbutton("Init & Run","run()")
xbutton("Stop","stoprun=1")
runStopAt = 10
xvalue("Continue til","runStopAt", 1,"{continuerun(runStopAt) stoprun=1}", 1, 1 )
runStopIn = 1
xvalue("Continue for","runStopIn", 1,"{continuerun(t + runStopIn) stoprun=1}", 1, 1 )
xbutton("Single Step","steprun()")
t = 2
xvalue("t","t", 2 )
tstop = 4
xvalue("Tstop","tstop", 1,"tstop_changed()", 0, 1 )
dt = 0.015625
xvalue("dt","dt", 1,"setdt()", 0, 1 )
steps_per_ms = 32
xvalue("Points plotted/ms","steps_per_ms", 1,"setdt()", 0, 1 )
screen_update_invl = 0.05
xvalue("Scrn update invl","screen_update_invl", 1,"", 0, 1 )
realtime = 0
xvalue("Real Time","realtime", 0,"", 0, 1 )
xpanel(805,589)
}
{
save_window_ = new Graph(0)
save_window_.size(0,4,-80,40)
scene_vector_[4] = save_window_
{save_window_.view(0, -80, 4, 120, 1314, 557, 300.48, 200.32)}
graphList[0].append(save_window_)
save_window_.save_name("graphList[0].")
save_window_.addexpr("fold.v( 1 )", 2, 1, 0.346326, 0.976676, 2)
save_window_.addvar("fold.v( 0.5 )", 1, 1, 0.333547, 0.9623, 2)
save_window_.addexpr("fold.v( 0 )", 4, 1, 0.355911, 0.928758, 2)
}
{
save_window_ = new PlotShape(0)
save_window_.size(-2.60217,2.22617,-1.54092,3.27992)
save_window_.variable("v")
scene_vector_[5] = save_window_
{save_window_.view(-2.60217, -1.54092, 4.82833, 4.82083, 101, 167, 200.64, 200.32)}
fast_flush_list.append(save_window_)
save_window_.save_name("fast_flush_list.")
}
{
save_window_ = new Graph(0)
save_window_.size(-1,2.23517e-08,-80,40)
scene_vector_[6] = save_window_
{save_window_.view(-1, -80, 1, 120, 57, 435, 300.48, 200.32)}
flush_list.append(save_window_)
save_window_.save_name("flush_list.")
objectvar rvp_
rvp_ = new RangeVarPlot("v")
fold rvp_.begin(1)
muscle rvp_.end(0)
rvp_.origin(0)
save_window_.addobject(rvp_, 2, 1, 0.8, 0.9)
}
objectvar scene_vector_[1]
{doNotify()}
ted
Site Admin
Posts: 6302
Joined: Wed May 18, 2005 4:50 pm
Location: Yale University School of Medicine
Contact:

Re: nmj junctional folds

Post by ted »

I'll check out your model later. Right now, I'm still working on the back of an envelope. For a rectangle of fluid with resistivity R ohm cm and these dimensions

Code: Select all

.      |<----------depth---------->|
.  --- +---------------------------+
.   ^  |\                           \
.   |  | \                           \
.width |  \                           \
.   |  |   \                           \
.   v  |    \                           \
.  --- +     \                           \
.  l \  \     +---------------------------+
.   e \  \    |                           |
.    n \  \   |                           |
.     g \  \  |                           |
.      t \  \ |                           |
.       h \  \|                           |
.         --- +---------------------------+
the resistance between the left and right faces (planes with size width x length separated by distance depth, all in um) is 1e4*R*D/(W*L) ohms. If R is 100 ohm cm (seems high for extracellular fluid, but maybe charge mobility in a fold is low), this simplifies to R*D/(W*L) megohms. Assuming that L=D=1 and W=0.2 makes the resistance 5 megohms. 1 pA through 1 megohm produces a voltage drop of 1 uV, so 100 pA on 5 megohms results in 0.5 mV.
Post Reply