Skip to main content

SONATA files reader

Project description

banner

license coverage documentation status

libsonata

C++ / Python reader for SONATA circuit files: SONATA guide

Installation

Installing from PyPI

pip install libsonata

Installing as a Python package, directly from GitHub

pip install git+https://github.com/BlueBrain/libsonata

Building the C++ library

git clone git@github.com:BlueBrain/libsonata.git --recursive
cd libsonata
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DEXTLIB_FROM_SUBMODULES=ON ..
make -j

Since libsonata uses backports for std::optional and std::variant which turn into their actual STL implementation once available, it’s recommended to compile libsonata with the same C++ standard as the project linking to libsonata. This is done by passing -DCMAKE_CXX_STANDARD={14,17} to the cmake command above.

Usage (Python)

Nodes

NodeStorage
>>> import libsonata

>>> nodes = libsonata.NodeStorage('path/to/H5/file')

# list populations
>>> nodes.population_names

# open population
>>> population = nodes.open_population(<name>)
NodePopulation
# total number of nodes in the population
>>> population.size

# attribute names
>>> population.attribute_names

# get attribute value for single node, say 42
>>> population.get_attribute('mtype', 42)

# ...or Selection of nodes (see below) => returns NumPy array with corresponding values
>>> selection = libsonata.Selection(values=[1, 5, 9, 42])  # nodes 1, 5, 9, 42
>>> mtypes = population.get_attribute('mtype', selection)
>>> list(zip(selection.flatten(), mtypes))
[(1, u'mtype_of_1'), (5, u'mtype_of_5'), (9, u'mtype_of_9'), (42, u'mtype_of_42')]
Selection

List of element IDs (either node_id, or edge_id) where adjacent IDs are grouped for the sake of efficient HDF5 file access. For instance, {1, 2, 3, 5} sequence becomes {[1, 4), [5, 6)}.

Selection can be instantiated from:
  • a sequence of scalar values (works for NumPy arrays as well)

  • a sequence of pairs (interpreted as ranges above, works for N x 2 NumPy arrays as well)

EdgePopulation connectivity queries (see below) return Selections as well.

>>> selection = libsonata.Selection([1, 2, 3, 5])
>>> selection.ranges
[(1, 4), (5, 6)]
>>> selection = libsonata.Selection([(1, 4), (5, 6)])
>>> selection.flatten()
[1, 2, 3, 5]
>>> selection.flat_size
4
>>> bool(selection)
True
Node Sets

libsonata can work with the Node Set concept, as described here: SONATA guide: Node Sets File This allows the definition of names for groups of cells, and a way to query them. libsonata also allows for extended expressions, such as Regular expressions,and floating point tests, as described here: SONATA extension: Node Sets

# load a node set JSON file
>>> node_sets = libsonata.NodeSets.from_file('node_sets.json')

# list node sets
>>> node_sets.names
{'L6_UPC', 'Layer1', 'Layer2', 'Layer3', ....}

# get the selection of nodes that match in population
>>> selection = node_sets.materialize('Layer1', population)

# node sets can also be loaded from a JSON string
>>> node_sets_manual = libsonata.NodeSets(json.dumps({"SLM_PPA_and_SP_PC": {"mtype": ["SLM_PPA", "SP_PC"]}}))
>>> node_sets_manual.names
{'SLM_PPA_and_SP_PC'}

Edges

EdgeStorage

Population handling for EdgeStorage is analogous to NodeStorage:

>>> edges = libsonata.EdgeStorage('path/to/H5/file')

# list populations
>>> edges.population_names

# open population
>>> population = edges.open_population(<name>)
EdgePopulation
# total number of edges in the population
>>> population.size

# attribute names
>>> population.attribute_names

# get attribute value for single edge, say 123
>>> population.get_attribute('delay', 123)

# ...or Selection of edges => returns NumPy array with corresponding values
>>> selection = libsonata.Selection([1, 5, 9])
>>> population.get_attribute('delay', selection) # returns delays for edges 1, 5, 9

…with additional methods for querying connectivity, where the results are selections that can be applied like above

# get source / target node ID for the 42nd edge:
>>> population.source_node(42)
>>> population.target_node(42)

# query connectivity (result is Selection object)
>>> selection_to_1 = population.afferent_edges(1)  # all edges with target node_id 1
>>> population.target_nodes(selection_to_1)  # since selection only contains edges
                                             # targeting node_id 1 the result will be a
                                             # numpy array of all 1's
>>> selection_from_2 = population.efferent_edges(2)  # all edges sourced from node_id 2
>>> selection = population.connecting_edges(2, 1)  # this selection is all edges from
                                                   # node_id 2 to node_id 1

# ...or their vectorized analogues
>>> selection = population.afferent_edges([1, 2, 3])
>>> selection = population.efferent_edges([1, 2, 3])
>>> selection = population.connecting_edges([1, 2, 3], [4, 5, 6])

Reports

SpikeReader
>>> import libsonata

>>> spikes = libsonata.SpikeReader('path/to/H5/file')

# list populations
>>> spikes.get_population_names()

# open population
>>> population = spikes['<name>']
SpikePopulation
# get all spikes [(node_id, timestep)]
>>> population.get()
[(5, 0.1), (2, 0.2), (3, 0.3), (2, 0.7), (3, 1.3)]

# get all spikes betwen tstart and tstop
>>> population.get(tstart=0.2, tstop=1.0)
[(2, 0.2), (3, 0.3), (2, 0.7)]

# get spikes attribute sorting (by_time, by_id, none)
>>> population.sorting
'by_time'

Pandas can be used to create a dataframe and get a better representation of the data
>>> import pandas

data = population.get()
df = pandas.DataFrame(data=data, columns=['ids', 'times']).set_index('times')
print(df)
       ids
times
0.1      5
0.2      2
0.3      3
0.7      2
1.3      3
SomaReportReader
>>> somas = libsonata.SomaReportReader('path/to/H5/file')

# list populations
>>> somas.get_population_names()

# open population
>>> population_somas = somas['<name>']
SomaReportPopulation
# get times (tstart, tstop, dt)
>>> population_somas.times
(0.0, 1.0, 0.1)

# get unit attributes
>>> population_somas.time_units
'ms'
>>> population_somas.data_units
'mV'

# node_ids sorted?
>>> population_somas.sorted
True

# get a list of all node ids in the selected population
>>> population_somas.get_node_ids()
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

# get the DataFrame of the node_id values for the timesteps between tstart and tstop
>>> data_frame = population_somas.get(node_ids=[13, 14], tstart=0.8, tstop=1.0)

# get the data values
>>> data_frame.data
[[13.8, 14.8], [13.9, 14.9]]

# get the list of timesteps
>>> data_frame.times
[0.8, 0.9]

# get the list of node ids
>>> data_frame.ids
[13, 14]

Once again, pandas can be used to create a dataframe using the data, ids and times lists

>>> import pandas

df = pandas.DataFrame(data_frame.data, columns=data_frame.ids, index=data_frame.times)
print(df)
       13    14
0.8  13.8  14.8
0.9  13.9  14.9
ElementReportReader
>>> elements = libsonata.ElementReportReader('path/to/H5/file')

# list populations
>>> elements.get_population_names()

# open population
>>> population_elements = elements['<name>']
ElementReportPopulation
# get times (tstart, tstop, dt)
>>> population_elements.times
(0.0, 4.0, 0.2)

>>> population_elements.get_node_ids()
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

# get the DataFrame of the node_id values for the timesteps between tstart and tstop
>>> data_frame = population_elements.get(node_ids=[13, 14], tstart=0.8, tstop=1.0)

# get the data values (list of list of floats with data[time_index][element_index])
>>> data_frame.data
[[46.0, 46.1, 46.2, 46.3, 46.4, 46.5, 46.6, 46.7, 46.8, 46.9], [56.0, 56.1, 56.2, 56.3, 56.4, 56.5, 56.6, 56.7, 56.8, 56.9]]

# get the list of timesteps
>>> data_frame.times
[0.8, 1.0]

# get the list of (node id, element_id)
>>> data_frame.ids
[(13, 30), (13, 30), (13, 31), (13, 31), (13, 32), (14, 32), (14, 33), (14, 33), (14, 34), (14, 34)]

The same way than with spikes and soma reports, pandas can be used to get a better representation of the data

>>> import pandas

df = pandas.DataFrame(data_frame.data, columns=pandas.MultiIndex.from_tuples(data_frame.ids), index=data_frame.times)
print(df)
       13                            14
       30    30    31    31    32    32    33    33    34    34
0.8  46.0  46.1  46.2  46.3  46.4  46.5  46.6  46.7  46.8  46.9
1.0  56.0  56.1  56.2  56.3  56.4  56.5  56.6  56.7  56.8  56.9

For big datasets, using numpy arrays could greatly improve the performance

>>> import numpy

np_data = numpy.asarray(data_frame.data)
np_ids = numpy.asarray(data_frame.ids).T
np_times = numpy.asarray(data_frame.times)

df = pandas.DataFrame(np_data, columns=pandas.MultiIndex.from_arrays(np_ids), index=np_times)

Acknowledgements

The development of this software was supported by funding to the Blue Brain Project, a research center of the École polytechnique fédérale de Lausanne (EPFL), from the Swiss government’s ETH Board of the Swiss Federal Institutes of Technology.

This research was supported by the EBRAINS research infrastructure, funded from the European Union’s Horizon 2020 Framework Programme for Research and Innovation under the Specific Grant Agreement No. 945539 (Human Brain Project SGA3). This project/research has received funding from the European Union’s Horizon 2020 Framework Programme for Research and Innovation under the Specific Grant Agreement No. 785907 (Human Brain Project SGA2).

License

libsonata is distributed under the terms of the GNU Lesser General Public License version 3, unless noted otherwise, for example, for external dependencies. Refer to COPYING.LESSER and COPYING files for details.

Copyright (c) 2018-2022 Blue Brain Project/EPFL

libsonata is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 3 as published by the Free Software Foundation.

libsonata is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with libsonata. If not, see <https://www.gnu.org/licenses/>.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

libsonata-0.1.23.tar.gz (1.0 MB view details)

Uploaded Source

Built Distributions

libsonata-0.1.23-cp311-cp311-manylinux_2_28_x86_64.whl (2.6 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.28+ x86-64

libsonata-0.1.23-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.6 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

libsonata-0.1.23-cp311-cp311-macosx_10_13_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.11 macOS 10.13+ x86-64

libsonata-0.1.23-cp310-cp310-manylinux_2_28_x86_64.whl (2.6 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.28+ x86-64

libsonata-0.1.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.6 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

libsonata-0.1.23-cp310-cp310-macosx_10_13_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.10 macOS 10.13+ x86-64

libsonata-0.1.23-cp39-cp39-manylinux_2_28_x86_64.whl (2.6 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.28+ x86-64

libsonata-0.1.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.6 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

libsonata-0.1.23-cp39-cp39-macosx_10_13_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.9 macOS 10.13+ x86-64

libsonata-0.1.23-cp38-cp38-manylinux_2_28_x86_64.whl (2.6 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.28+ x86-64

libsonata-0.1.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.6 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

libsonata-0.1.23-cp38-cp38-macosx_10_13_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.8 macOS 10.13+ x86-64

File details

Details for the file libsonata-0.1.23.tar.gz.

File metadata

  • Download URL: libsonata-0.1.23.tar.gz
  • Upload date:
  • Size: 1.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.17

File hashes

Hashes for libsonata-0.1.23.tar.gz
Algorithm Hash digest
SHA256 815aac5bdaa5d025b5f3558ac4d3acb9ebcb070594109af4c0844f47ec701c1d
MD5 21cff5afd7f06a7a32fee19afa6713af
BLAKE2b-256 40f18a8ea6ea6ed9e3779e968e121dadbbc9b74189b6df73372972baf6f345c9

See more details on using hashes here.

File details

Details for the file libsonata-0.1.23-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for libsonata-0.1.23-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7bb7fe65af43631fc02515d28f3a65c94bda59f26192ecd1bb9fb795c72d4613
MD5 2440aba0771a6b5147e5484248722e69
BLAKE2b-256 3c423f6aa4ae8786db271585a0b0467676152dc12b39ddcc7216ac68b35647e7

See more details on using hashes here.

File details

Details for the file libsonata-0.1.23-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for libsonata-0.1.23-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 022ef07e54a716757054c9686490222336c0099e1e17501a8c52f52f2fc0492e
MD5 3067a04f0dcfb73d6c5d9dc262beb520
BLAKE2b-256 ca712c5f694a55cbf9dd19c0a03885bd9720e635707bc97ba1aa3ff44191fc4c

See more details on using hashes here.

File details

Details for the file libsonata-0.1.23-cp311-cp311-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for libsonata-0.1.23-cp311-cp311-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 1067f497e59736502040e0d568382a9c35e314d93dc44dec0bb7719901f91b12
MD5 36d1aa4adb24523315d012cd978a2442
BLAKE2b-256 3995cc62791656be7bee1e292b1fb953a784371fadffd275b5c3ebbd246f3665

See more details on using hashes here.

File details

Details for the file libsonata-0.1.23-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for libsonata-0.1.23-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f2d590fb5130b581e61a844e8128dbbfd6c9e657a373d91a3218ced3140152de
MD5 1a44fead5782cad1ecd5685c24f4cad5
BLAKE2b-256 e4df4b6eb5d6877c738c7a1f98a36af6fa3027f8818f85451283768f73b3afb7

See more details on using hashes here.

File details

Details for the file libsonata-0.1.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for libsonata-0.1.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ad93e0106ef9e79decb036406a5b08fbb18d8e414724bee8451b297687613bb3
MD5 27af825a0f971640cdb68624f08b4395
BLAKE2b-256 dc4eaab9a56c4424b0d07a453c5a305bffc8c6d171bd8b09aa99de039eb1870a

See more details on using hashes here.

File details

Details for the file libsonata-0.1.23-cp310-cp310-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for libsonata-0.1.23-cp310-cp310-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 3ed56c72536226c549c484622aa38208457e551d4d3c644e20e970ef1bb92b0b
MD5 e764e78b614cbf22be3f4f7e988f7bbb
BLAKE2b-256 3a7380da3666d08354033760e21675d1f942b8ebfffe43dd244932d0d2b123d4

See more details on using hashes here.

File details

Details for the file libsonata-0.1.23-cp39-cp39-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for libsonata-0.1.23-cp39-cp39-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6101244d08ffeb41195a78cc08a26e3313c6b0b6df0c751e3e0e9f140bb6825c
MD5 3e491c02d1e3a7b1f8fb03647b5a8c3b
BLAKE2b-256 aeaf1520da095d237321a9acda2c829ce0f80ef0aada3fdb4ce1874a7c6046ce

See more details on using hashes here.

File details

Details for the file libsonata-0.1.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for libsonata-0.1.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e1ae413ac53e16cfda63a3a1f9bb766d1fc08e68189e2eec2eddac4f48498114
MD5 f19650a8de21f7b03100e54663ea8f91
BLAKE2b-256 faf08eb042179b38bdc57d6cd64e0cc339af2655eb8a6887a53598094ebc0c35

See more details on using hashes here.

File details

Details for the file libsonata-0.1.23-cp39-cp39-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for libsonata-0.1.23-cp39-cp39-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 19681ad4f614b0b0c0c5ff565c289770c54805d11fd606e992d461bdb845edd2
MD5 3bc625a8c59be51ff0c6b429a786dd50
BLAKE2b-256 b86accb64007d5cf88d112c53c52e406c6b77d6a3f4998c872eb4c1306f6ff16

See more details on using hashes here.

File details

Details for the file libsonata-0.1.23-cp38-cp38-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for libsonata-0.1.23-cp38-cp38-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e4d41b96c528c0a9e8310647251cd917f1a34d07b9ee514e7532802136e2f5e3
MD5 e53cd480b0825f2479d0c19962d2fa53
BLAKE2b-256 febb0a1ed914b5dcdee4c2a2f7b14061980fe5b0ee9ebb6cfc7402b9b307d151

See more details on using hashes here.

File details

Details for the file libsonata-0.1.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for libsonata-0.1.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 75adae58105e1611c7746d842f5a3f7871ecfb81e9e93955de8d7f991d0ccb89
MD5 c2ea3abbe567bdf79f44671a7e38e8be
BLAKE2b-256 eeba54d3c3f3d1b2a49d51a384714ef545d90ad3fc85dd34c596c1d12698b32d

See more details on using hashes here.

File details

Details for the file libsonata-0.1.23-cp38-cp38-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for libsonata-0.1.23-cp38-cp38-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 944ab36ec5863b8ffcb155a8bbbfde004e5dfa92f5014425636378501ee1c813
MD5 9094e23773a88cf9a5eae30401381422
BLAKE2b-256 23088b18261d219c37eb24bd77169ca7912417b55a4ab6bed41237eaf1deba3d

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page