L5 pyramidal model simulations

The basics of how to develop, test, and use models.
Post Reply
steve

L5 pyramidal model simulations

Post by steve »

From my last post answer (Thanks Ted) I now understand how to enter a prerecorded set of spike times into my model.

I was wondering what the best "standard" way to perform my simulation is:

I loaded up the L5 pyramidal model by Mainen from ModelDB and want to inject it with 5000 correlated spike trains. Is the best way to do this:

1) to load up the L5 model into CellBuilder
2) using CellBuilder to create some form of template of the Cell, save to a hoc file.
3) procede as the FAQ shows and inject the prerecorded spike trains into the dendrites?

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

Re: L5 pyramidal model simulations

Post by ted »

I loaded up the L5 pyramidal model by Mainen from ModelDB
Presumably you got patdemo.zip, which contains the code for this paper:
Mainen ZF, Sejnowski TJ (1996) Influence of dendritic structure on firing pattern
in model neocortical neurons. Nature 382:363-6.

What's not so clear is the meaning of "loaded up the L5 pyramidal model."

Did you just get the basic morphology of the cell by executing j4a.hoc? Or did you try
to capture what the authors actually used in their simulations? i.e. the model specification
that exists in the computer after you run mosinit.hoc, and click on the "L5 Pyramid"
button. The former omits the axon (axon hillock, initial segment, nodes and internodes),
has no biophysical properties other than default cm and Ra, and has not been "adjusted
for the presence of spines." And neither the former, nor the latter, uses nseg values that
satisfy the d_lambda = 0.1 criterion for spatial accuracy throughout the entire model
(this probably doesn't affect the qualitative results reported in that paper, but it could
have untoward consequences for simulations that involve synaptic inputs distributed
over the dendritic tree).

So tell me which of these two interpretations is correct, and I'll try to give you a useful
answer to your question.
steve

Re: L5 pyramidal model simulations

Post by steve »

I used the latter method, ie. I selected "L5 pyramid" and then went into CellBuilder to create the template...

However now that I have been playing around with patdemo, I think I can just adjust some methods and make it work for my simulations without an explicit cell template. ie. I believe I could just update demofig1.hoc for the L5 case, and add the injection of the spike trains from the input files.

I was also wondering about the following, if I want to inject the values of file called "serie0" into dend1[0], should I make the source of the netcon a NULLObject and the target the ExpSyn I attached to dend1[0]. Because surely the source is now generated via netcon.event calls? The problem is if I make the source nil I get an error messaging saying source cannot be resolved and the netcon is not created. For more info this is some of the code:

load_3dcell("cells/j4a.hoc")

input=new File()
input.ropen("serie0")
vector = new Vector(100)
vector.scanf(input)

dend1[0] NetConSynapse = new ExpSyn(0)
objref nc, nil
nc = new NetCon(nil, NetConSynapse, 0, 0, 0.6)
nc.delay = 0

nc fih = new FInitializeHandler("loadqueue()")

error: attempt to evaluate a non-variable nil

Thanks for all your help,
Steve
ted
Site Admin
Posts: 6303
Joined: Wed May 18, 2005 4:50 pm
Location: Yale University School of Medicine
Contact:

Re: L5 pyramidal model simulations

Post by ted »

steve wrote:I used the latter method, ie. I selected "L5 pyramid" and then went into CellBuilder to create the template...
This is a nontrivial issue. Mainen & Sejnowski's code takes spine surface area into
account by fiddling section lengths and diameters (the "folding factor" approach used
by Jack et al (1989) and Major (1994))--i.e. they actually increase surface area
without affecting "electrotonic length" of each section--see proc add_spines() in
demofig1.hoc. The result is a model whose dimensions differ from the original
morphometric data. My personal preference is to leave cell dimensions unaltered,
but to change cm and channel densities instead. Either approach is perfectly
acceptable as long as you remember what's going on.
However now that I have been playing around with patdemo, I think I can just adjust some methods and make it work for my simulations without an explicit cell template. ie. I believe I could just update demofig1.hoc for the L5 case, and add the injection of the spike trains from the input files.
A very good way to proceed, if you want to use exactly the same model L5 cell as
M&S did.

However, if you are concerned about spatial accuracy, you may want to specify nseg
with the the d_lambda method, instead of using the artibrary method employed in the
original code. For example, the original code used nseg=5 for the myelinated internodes,
but the d_lambda method indicates that nseg=1 is adequate. However, the original
code produced a model with a total of 479 segments, whereas using the default
d_lambda rule gives a total of 1054 segments. So in some places, the original code
chops space far too finely, and in others (probably dendrites, which is where all the
interesting synaptic processing is happening) it is too coarse.
I was also wondering about the following, if I want to inject the values of file called "serie0" into dend1[0], should I make the source of the netcon a NULLObject and the target the ExpSyn I attached to dend1[0]. Because surely the source is now generated via netcon.event calls? The problem is if I make the source nil I get an error messaging saying source cannot be resolved and the netcon is not created.
This works:

Code: Select all

load_file("nrngui.hoc")

create soma
access soma
diam = 10
L = 100/diam/PI
insert pas

objref syn
syn = new ExpSyn(0.5)

objref nc, nil
nc = new NetCon(nil, syn)
nc.weight = 0.001

objref syntimes
syntimes = new Vector(2)
syntimes.x[0] = 2
syntimes.x[1] = PI

objref fih
fih = new FInitializeHandler("loadqueue()")
proc loadqueue() { local ii
  for ii=0,syntimes.size()-1 nc.event(syntimes.x[ii])
}
If it doesn't work for you, there may be a bug in the particular release of NEURON that
you are using. In this case, please let me know what version it is, and which OS you
are using. Then update to the latest standard distribution or alpha release for your OS.
Post Reply