Skip to content
Snippets Groups Projects
network_ring.rst 8.36 KiB

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:

  1. Building a basic :py:class:`arbor.cell` with a synapse site and spike generator.
  2. Building a :py:class:`arbor.recipe` with a network of interconnected cells.
  3. 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.