This simulation and analysis package implements the model described in (Pinheiro Neto et al, 2019).
Lets run the model and show that a considerably subcritical network with m=0.9 (and an intrinsict timescale of ~20 ms) with a reasonable inter-electrode distance of de = 4 (corresponding to 200 micrometers in experiments) can reproduce experimental coarse-sampled results of arguably critical networks.
First we build and run the model, which is written in C++ and requires the hdf5 library (for troubleshooting, read the simulation details below):
make cc
./exe/cc -o subcritical.hdf5 -m 0.9 -h 2e-4 -de 4 -T 1000000 -N 160000
This runs the subcritical dynamics for 1e6 timesteps (equivalent to ~33 min of recordings) with a population rate of 1 Hz. For practicity, the dataset generated by this simulation is available HERE.
The analysis is done in Python, and depends on the following packages: powerlaw, h5py and scipy. These can be installed with pip install powerlaw h5py scipy.
From an interactive Python session, we then run:
import sys
sys.path.insert('ana/')
import analysis
analysis.sim_plot_deltaT('subcritical.hdf5',[1,2,4,8],'coarse')
This analyzes and plots the observables discussed in the paper for binsizes in the range 1-8 timesteps, corresponding to 2-16 ms. The resulting plots should look like this:
The simulation is written in C++ and relies on the hdf5 library to write its output. Depending on your platform, this may be installed manually from above link or using a package manager. For instance, on macOS it is available via Homebrew.
brew install hdf5
while for Ubuntu it can be installed with
sudo apt-get install libhdf5-dev
If installed via a package manager, the compiler should automatically find the libraries. If you get problems compiling, edit the makefile to tell the compiler where hdf5 is located (e.g. IFLAGS = -L /usr/lib/x86_64-linux-gnu/hdf5/serial -I /usr/include/hdf5/serial). To get an idea where the libraries are located on your system try which h5cc or whereis hdf5.h.
To compile the simulation, cd into the cloned directory and
make
The resulting exectuable ./exe/cc takes the following arguments:
"-o" type: string required // output path for results
"-T" type: double default: 1e5 // number of time steps
"-t" type: double default: 1e3 // thermalization steps before measuring
"-N" type: integer default: 160000 // number of neurons
"-k" type: integer default: 1000 // average outgoing connections per neuron
"-e" type: integer default: 64 // total number of electrodes
"-dn" type: double default: 50. // inter-neuron (nearest-neigbour) distance
"-de" type: double default: 8. // electrode dist. [unit=nearestneur-dist]
"-s" type: integer default: 314 // seed for the random number generator
"-m" type: double default: .98 // branching parameter applied locally
"-g" type: double default: 6. // eff. conn-length [unit=nearestneur-dist]
"-h" type: double default: 4e-5 // probability for spontaneous activation
"-c" type: double default: 1e5 // [num time steps] before hist is written
To run the simulation:
./exe/cc -o ./dat/testrun.hdf5
The analysis package is written in Python, and depends on the following packages: h5py, scipy, powerlaw. After running a simulation and obtaining testrun.hdf5, the easiest way to analyze the results is to add ana/ to the python path, and run
import analysis
analysis.sim_plot_deltaT('testrun.hdf5',[1,2,4,8],'coarse')
analysis.sim_plot_deltaT('testrun.hdf5',[1,2,4,8],'sub')
where [1,2,4,8] is the vector of binsizes (in units of timesteps) to use. That should analyze the dataset and plot the avalanche-size distribution, fitted exponent of the power-law, and estimated branching parameter. The function can take other optional parameters, described in the docstring. In order to compare different datasets dataset_A.hdf5 and dataset_B.hdf5 (with e.g. different inter-electrode distances), one can also run
import analysis
analysis.sim_plot_pS('dataset_A.hdf5',4,'both', str_leg='Dataset A')
analysis.sim_plot_pS('dataset_B.hdf5',4,'both', str_leg='Dataset B')
which plots both coarse-sampled and sub-sampled avalanche-size distributions for datasets A and B with deltaT=4 timesteps.
Batch data generated by the simulation can be analyzed executing run_analysis.py, and figures similar to the ones in the main paper can be generated using generate_figures.py. A list of the arguments can be obtained with python ana/run_analysis.py --help. Arguments not used in the corresponding mode (e. g. --binsize for --mode threshold) will be ignored.
The data format must end in _r[nn].hdf5 where [nn] corresponds to n realizations of the simulation, and must be ordered from 00 to n-1.
For demonstration, here we will use the following datasets:
dat/m0.98000_h4.000e-05_de02_ga-1.00_r00.hdf5
dat/m0.98000_h4.000e-05_de02_ga-1.00_r01.hdf5
dat/m0.98000_h4.000e-05_de02_ga-1.00_r02.hdf5
The first step is to threshold the data:
python ana/run_analysis.py --mode threshold --data_dir dat --reps 3
To do the avalanche analysis on the thresholded data and save the avalanche-size distribution p(S) we can then run
python ana/run_analysis.py --mode save_ps --data_dir dat/ --binsize 1,2,4,8,16
