-
Brent Huisman authoredUnverified0998de7b
A ring network
In this example, a small network of cells, arranged in a ring, will be created and the simulation distributed over multiple threads or GPUs if available.
Note
Concepts covered in this example:
- Building a basic :py:class:`arbor.cell` with a synapse site and spike generator.
- Building a :py:class:`arbor.recipe` with a network of interconnected cells.
- Running the simulation and extract the results.
The cell
Step (1) shows a function that creates a simple cell with a dendrite. We construct the following :term:`morphology` and label the soma and dendrite:
A 4-segment cell with a soma (pink) and a branched dendrite (light blue).
In step (2) we create a :term:`label` for both the root and the site of the synapse. These locations will form the endpoints of the connections between the cells.
We'll create labels for the root (red) and a synapse_site (black).
After we've created a basic :py:class:`arbor.decor`, step (3) places a synapse with an exponential decay ('expsyn'
) on the 'synapse_site'
.
The synapse is given the label 'syn'
, which is later used to form :py:class:`arbor.connection` objects terminating at the cell.
Note
Mechanisms can be initialized with their name; 'expsyn'
is short for arbor.mechanism('expsyn')
.
Mechanisms typically have some parameters, which can be queried (see :py:class:`arbor.mechanism_info`) and set
(see :py:class:`arbor.mechanism`). In particular, the e
parameter of expsyn
defaults to 0
, which makes it,
given the typical resting potential of cell membranes of -70 mV
, an excitatory synapse.
Step (4) places a spike detector at the 'root'
. The detector is given the label 'detector'
, which is later used to form
:py:class:`arbor.connection` objects originating from the cell.
Note
The number of synapses placed on the cell in this case is 1, because the 'synapse_sites'
locset is an explicit location.
Had the chosen locset contained multiple locations, an equal number of synapses would have been placed, all given the same label 'syn'
.
The same explanation applies to the number of detectors on this cell.
The recipe
To create a model with multiple connected cells, we need to use a :py:class:`recipe <arbor.recipe>`. The recipe is where the different cells and the :ref:`connections <interconnectivity>` between them are defined.
Step (5) shows a class definition for a recipe with multiple cells. Instantiating the class requires the desired
number of cells as input. Compared to the :ref:`simple cell recipe <tutorialsinglecellrecipe>`, the main differences
are connecting the cells (8), returning a configurable number of cells (6) and returning a new cell per gid
(7)
(make_cable_cell()
returns the cell above).
Step (8) creates an :py:class:`arbor.connection` between consecutive cells. If a cell has gid gid
, the
previous cell has a gid (gid-1)%self.ncells
. The connection has a weight of 0.01 (inducing a conductance of 0.01 μS
in the target mechanism expsyn
) and a delay of 5 ms.
The first two arguments to :py:class:`arbor.connection` are the source and target of the connection.
The source is a :py:class:`arbor.cell_global_label` object containing a cell index gid
, the source label
corresponding to a valid detector label on the cell and an optional selection policy (for choosing a single detector
out of potentially many detectors grouped under the same label - remember, in this case the number of detectors labeled
'detector' is 1).
The :py:class:`arbor.cell_global_label` can be initialized with a (gid, label)
tuple, in which case the selection
policy is the default :py:attr:`arbor.selection_policy.univalent`; or a (gid, (label, policy))
tuple.
The target is a :py:class:`arbor.cell_local_label` object containing a cell index gid
, the target label
corresponding to a valid synapse label on the cell and an optional selection policy (for choosing a single synapse
out of potentially many synapses grouped under the same label - remember, in this case the number of synapses labeled
'syn' is 1).
The :py:class:`arbor.cell_local_label` can be initialized with a label
string, in which case the selection
policy is the default :py:attr:`arbor.selection_policy.univalent`; or a (label, policy)
tuple. The gid
of the target cell doesn't need to be explicitly added to the connection, it is the argument to the
:py:func:`arbor.recipe.connections_on` method.