Hopfield Brody synchronization (sync) model
How it works
Beyond the GUI -- Saving and displaying spikes
Synchronization measures
Procedure interval2() in ocomm.hoc sets cell periods randomly
Rewiring the network
Assessing connectivity
Graphing connectivity
Animate
.
The exercises below are intended primarily to familiarize the student with techniques and tools useful for the implementation of networks in Neuron. We have chosen a relatively simple network in order to minimize distractions due to the complexities of channel kinetics, dendritic trees, detailed network architecture, etc. The following network uses an artificial integrate-and-fire cell without channels or compartments. There is only one kind of cell, so no issues of organizing interactions between cell populations. There is only one kind of synapse. Additionally, suggested algorithms were chosen for ease of implementation rather than quality of results.
Although this is a minimal model, learning the ropes is still
difficult. Therefore, we suggest that you go through the entire lesson
relatively quickly before returning to delve more deeply into the
exercises. Some of the exercises are really more homework projects (eg
design a new synchronization measure). These are marked with asterisks.
As you know, Neuron is optimized to handle the complex
channel and compartment simulations that have been omitted from this
exercise. The interested student might wish to convert this network
into a network of spiking cells with realistic inhibitory interactions
or a hybrid network with both realistic and artificial cells. Such an
extended exercise would more clearly demonstrate Neuron's advantages for
performing network simulations.
The basic intfire implementation in neuron utilizes a decaying state variable (m
as a stand-in for voltage) which is pushed up by the arrival of an
excitatory input or down by the arrival of an inhibitory input (m = m + w). When m exceeds threshold the cell "fires," sending events to other connected cells.
if (m>1) { ...
net_event(t) : trigger synapses
>>> mycell = Cell()
>>> print mycell.pp, mycell.pp.tau, mycell.pp.invl
The Cell template also provides 3 procedures. connect2target() is optionally used to hook this cell to a postsynaptic cell.
The synchronization mechanism requires that all of the cells fire spontaneously at similar frequencies. It is obvious that if all cells are started at the same time, they will still be roughly synchronous after one cycle (since they have similar intrinsic cycle periods). After two cycles, they will have drifted further apart. After many cycles, differences in period will be magnified, leading to no temporal relationship of firing.
The key observation utilized here is that firing is fairly synchronized one cycle after onset. The trick is to reset the cells after each cycle so that they start together again. They then fire with temporal differences equal to the differences in their intrinsic periods. This resetting can be provided by an inhibitory input which pushes state variable m down far from threshold (hyperpolarized, as it were). This could be accomplished through an external pacemaker that reset all the cells, thereby imposing an external frequency onto the network. The interesting observation in this network is that pacemaking can also be imposed from within, though an intrinsic connectivity that enslaves all members to the will of the masses.
>>> savspks() # record spike times to tvec; indices to ind
>>> h.run() # or hit run button on GUI
>>> g = h.Graph()
>>> ind.mark(g,tvec) # throw them up there
>>> showspks() # fancier marking with sync lines
>>> syncer()
>>> for w in np.arange(0,-5e-2,-5e-3): weight(w); h.run(); print w,syncer()
>>> [vec.resize(0) for vec in veclist] # clear
>>> for w in np.arange(0, -5e-2, -5e-3):
weight(w)
h.run()
vec[1].append(w)
vec[2].append(syncer())
>>> print vec[1].size(), vec[2].size() # make sure nothing went wrong
>>> g.erase() # assuming it's still there, else put up a new one
>>> vec[2].line(g,vec[1]) # use "View = plot" on pull down to see it
>>> vec[2].mark(g,vec[1],"O",8,2,1) # big (8) red (2) circles ("O")
>>> def interval (x,y): interval2(x,y)
All of the programs discussed in the lecture are available in ocomm.hoc. The student may wish to use or rewrite any of these procedures. Below we suggest a different approach to wiring the network.
def wire ():nclist.remove_all()
for pre in cells:
for post in cells:
if pre!=post: nclist.append(h.NetCon(pre.pp,post.pp))
eg
rdm.discunif(0,ncell-1)
proj=rdm.repick()
if proj < ncell/2:
# project to 0->proj
else: # project to proj->ncell-1
This algorithm is not very good since cells in center get more convergence
Last updated: Jun 16, 2015 (9:34)