SONATA Population

To distinguish between nodes and edges contained or connecting different brain parts, we will use populations, as per the SONATA specification. For simplicity, it is recommended to save each population in a separate file.

Naming

The following shows the naming adapted in BBP.

Nodes

For nodes, the following naming scheme is proposed:

/nodes/${part}_${type}

Where ${part} may be NCX for the neocortex, and ${type} can presently take the following values:

  • neurons

  • astrocytes

  • projections

Examples:

/nodes/thalamus_astrocytes
/nodes/thalamus_neurons
/nodes/ncx_astrocytes
/nodes/ncx_neurons
/nodes/hippocampus_projections

Edges

Connectivity between these populations is directional, and edges will be contained in populations specifying source and target node populations as well as connection type:

/edges/${source_population}__${target_population}__${connection_type}

Note

The naming uses double underscores!

If the source and target node population are identical, a single edge population can be used. In this particular usecase the edge population is bi-directional.

Currently, the following connection types are supported:

electrical

this includes gap junctions for instance.

chemical

this would include the following possible subtypes: glutamatergic, gabaergic, dopaminergic, serotinergic, adrenergic

synapse_astrocyte

this manages the connection from an astrocyte to a particular synapse

endfoot

this manages the connection between a vasculature and an astrocyte

Examples:

/edges/thalamus_neurons__ncx_neurons__chemical

Single/Multi Populations

In this subsection the Single-Population and Multi-Population setups are explained. We will use the following example setup with 3 nodes (A, B and C) and 4 edges (0,1,2 and 3).

SONATA populations example setup

Each population in the sonata file contains a list of fields, which describe e.g the position of a node, it’s morphological type etc.

Single Population

The Nodes are described in a single population SingleNodePop:

/nodes/SingleNodePop/0/
    node_id (index) | morphology
    0               | A
    1               | B
    2               | C

and the edges as well in a single population SingleNodePop:

/edges/SingleEdgePop/
    edge_id (index) | source_node_id        | target_node_id        | 0/[attributes]
                    | attr: 'SingleNodePop' | attr: 'SingleNodePop' |
    0               | 0                     | 1                     | ...     <- synapse 0
    2               | 0                     | 1                     | ...     <- synapse 1
    3               | 0                     | 2                     | ...     <- synapse 2
    4               | 0                     | 2                     | ...     <- synapse 3

Here, the entries source_node_id and target_node_id are lists of node_id’s, and each of them contain an attribute attr - in this case the text SingleNodePop.

Multi Population

Here, the Nodes are described in different populations:

/nodes/OnlyA/0/
    node_id (index) | morphology
    0               | A

/nodes/OnlyB/0/
    node_id (index) | morphology
    0               | B

/nodes/OnlyC/0/
    node_id (index) | morphology
    0               | C

and so are the Edges:

/edges/A__B/
    edge_id (index) | source_node_id | target_node_id | 0/[attributes]
                    | attr: 'OnlyA'  | attr: 'OnlyB'  |
    0               | 0              | 0              | ...     <- synapse 0
    1               | 0              | 0              | ...     <- synapse 1


/edges/A__C/
    edge_id (index) Index | source_node_id | target_node_id | 0/[attributes]
                    | attr: 'OnlyA'  | attr: 'OnlyC'  |
    0               | 0              | 0              | ...      <- synapse 2
    1               | 0              | 0              | ...      <- synapse 3

Again, the entries source_node_id and target_node_id are lists of node_id’s. But now, each population has different attributes attr for the entries source_node_id and target_node_id, referring to the node population the node-id’s are taken from.

If you have \(n\) different node populations, and each population would be connected with each other population, you need \(n^2\) edge populations (as they are unidirectional, and you can have intra connections inside the node populations).

Groups

As per the SONATA specification it is possible to define several node groups, but within BBP we restrict to a single group 0. Therefore, the fields node_group_id and node_group_index are not used.