# Create config file
with open('config.py', 'w') as fp:
fp.write(
'''import os
base_path = os.path.abspath(".")
data_path = os.path.abspath("simulations")
jobscript_template = "python {base_path}/run_simulation.py {label}"
submit_cmd = "bash -c"
''')create_JupyterLab_kernel.sh
Down-scaled multi-area model
%matplotlib inline
import numpy as np
import os
import nest
import json
from multiarea_model import MultiAreaModel
from config import base_path, data_path
import sys
sys.path.append('./figures/MAM2EBRAINS')
-- N E S T --
Copyright (C) 2004 The NEST Initiative
Version: 3.4
Built: May 17 2023 20:48:31
This program is provided AS IS and comes with
NO WARRANTY. See the file LICENSE for details.
Problems or suggestions?
Visit https://www.nest-simulator.org
Type 'nest.help()' to find out more about NEST.
!pip install nested_dict dicthashRequirement already satisfied: nested_dict in /srv/main-spack-instance-2302/spack/var/spack/environments/ebrains-23-02/.spack-env/._view/6axslmv6jvf4v2nte3uwlayg4vhsjoha/lib/python3.8/site-packages (1.61)
Requirement already satisfied: dicthash in /srv/main-spack-instance-2302/spack/var/spack/environments/ebrains-23-02/.spack-env/._view/6axslmv6jvf4v2nte3uwlayg4vhsjoha/lib/python3.8/site-packages (0.0.2)
Requirement already satisfied: future in /srv/main-spack-instance-2302/spack/var/spack/environments/ebrains-23-02/.spack-env/._view/6axslmv6jvf4v2nte3uwlayg4vhsjoha/lib/python3.8/site-packages (from dicthash) (0.18.2)
# Jupyter notebook display format setting
from IPython.display import display, HTML
style = """
<style>
table {float:left}
</style>
"""
display(HTML(style))
# Ignore and don't display warning messages
import warnings
warnings.filterwarnings("ignore")Go back to Notebook structure
| Parameter | Default value | Value range/options | Value assigned | Description |
|---|---|---|---|---|
| scale_down_to | 1. | (0, 1.0] | 0.005 | $^1$ |
| cc_weights_factor | 1. | [1.0, 2.5] | 1. | $^2$ |
| areas_simulated | complete_area_list | Sublists of complete_area_list | complete_area_list | $^3$ |
| replace_non_simulated_areas | None | None, 'hom_poisson_stat', 'het_poisson_stat', 'het_current_nonstat' | 'het_poisson_stat' | $^4$ |
scale_down_to
scale_down_tois the down-scaling factor which defines the the ratio of the full scale multi-area model being down-scaled to a model with fewer neurons and indegrees so as to be simulated on machines with lower computational ability and the simulation results can be obtained within relative shorter period of time.
Its deafualt value if1.meaning full scale simulation.
In the pre-set downscale version, it's set as0.005, where the numer of neurons and indegrees are both scaled down to 0.5% of its full scale amount, where the model can usually be simulated on a local machine.
Warning: This will not yield reasonable dynamical results from the network and is only meant to demonstrate the simulation workflow
cc_weights_factor
This scaling factor controls the cortico-cortical synaptic strength.
By default it's set as1.0, where the inter-area synaptic strength is the same as the intra-areal.
Important: This factor changes the network activity from ground state to metastable state.areas_simulated
This parameter specifies the cortical areas included in the simulation process. Its default value iscomplete_area_listmeaning all the areas in the complete_area_list will be actually simulated.
complete_area_list = ['V1', 'V2', 'VP', 'V3', 'V3A', 'MT', 'V4t', 'V4', 'VOT', 'MSTd', 'PIP', 'PO', 'DP', 'MIP', 'MDP', 'VIP', 'LIP', 'PITv', 'PITd', 'MSTl', 'CITv', 'CITd', 'FEF', 'TF', 'AITv', 'FST', '7a', 'STPp', 'STPa', '46', 'AITd', 'TH']
The value assigned to simulation_areas can be any sublist of the compete_area_list specifying areas a user want to include in his/her simulation.replace_non_simulated_areas
The paramterreplace_non_simulated_areasdefines how non-simulated areas will be replaced.
It's set asNoneby default when the parameter areas_simulated is set as full_area_list where all areas will be simulated so that no areas need to be replaced.
Other options are:'hom_poisson_stat','het_poisson_stat', and'het_current_nonstat'.'hom_poisson_stat'is a manually set parameter which can be tuned. When it's set as 'het_poisson_stat' or 'het_current_nonstat', the data to replace the cortico-cortical input is loaded from 'replace_cc_input_source' which is the firing rates of our full scale simulation results. The differenc between 'het_poisson_stat' and 'het_current_nonstat' is that 'het_poisson_stat' is the mean of the time-series firing rate so that it's static, yet 'het_current_nonstat' is time-varying specific current, which is varying by time.
# Downscaling factor
# Value range/options: (0, 1.]
# Value assgined: 0.005
scale_down_to = 0.005 # Change it to 1. for running the fullscale network
# Scaling factor for cortico-cortical connections (chi)
# Value range/options: [1., 2.5]
# Value assgined: 1.0
cc_weights_factor = 1.0
# Cortical areas included in the simulation
# Value range/options: any sublist of complete_ares_list
# Value assgined: complete_ares_list
areas_simulated = ['V1', 'V2', 'VP', 'V3', 'V3A', 'MT', 'V4t', 'V4', 'VOT', 'MSTd', 'PIP', 'PO', 'DP', 'MIP', 'MDP', 'VIP', 'LIP', 'PITv', 'PITd', 'MSTl', 'CITv', 'CITd', 'FEF', 'TF', 'AITv', 'FST', '7a', 'STPp', 'STPa', '46', 'AITd', 'TH']
# Firing rates used to replace the non-simulated areas
# Value range/options: None, 'hom_poisson_stat', 'het_poisson_stat', 'het_current_nonstat'
# Value assgined: 'het_poisson_stat'
replace_non_simulated_areas = 'het_poisson_stat'# Connection parameters
conn_params = {
'replace_non_simulated_areas': 'het_poisson_stat', # Whether to replace non-simulated areas by Poisson sources with the same global rate, by default: None
'g': -11., # It sets the relative inhibitory synaptic strength, by default: -16.
'K_stable': 'K_stable.npy', # Whether to apply the stabilization method of Schuecker, Schmidt et al. (2017), by default: None
'fac_nu_ext_TH': 1.2, # Increase the external input to 2/3E and 5E in area TH
'fac_nu_ext_5E': 1.125, # Increase the external Poisson indegree onto 5E
'fac_nu_ext_6E': 1.41666667, # Increase the external Poisson indegree onto 6E
'av_indegree_V1': 3950. # Adjust the average indegree in V1 based on monkey data
}
# Input parameters
input_params = {
'rate_ext': 10. # Rate of the Poissonian spike generator (in spikes/s)
}
# Neuron parameters
neuron_params = {
'V0_mean': -150., # Mean for the distribution of initial membrane potentials, by default: -100.
'V0_sd': 50.} # Standard deviation for the distribution of initial membrane potentials, by default: 50.
# Network parameters
network_params = {
'N_scaling': scale_down_to, # Scaling of population sizes, by default: 1.
'K_scaling': scale_down_to, # Scaling of indegrees, by default: 1.
'fullscale_rates': 'tests/fullscale_rates.json', # Absolute path to the file holding full-scale rates for scaling synaptic weights, by default: None
'input_params': input_params, # Input parameters
'connection_params': conn_params, # Connection parameters
'neuron_params': neuron_params # Neuron parameters
}
# Simulation parameters
sim_params = {
'areas_simulated': areas_simulated,
't_sim': 2000., # Simulated time (in ms), by default: 10.0
# 't_sim': 1500., # Simulated time (in ms), by default: 10.0
'num_processes': 1, # The number of MPI processes, by default: 1
'local_num_threads': 1, # The number of threads per MPI process, by default: 1
'recording_dict': {'record_vm': False},
'rng_seed': 1 # global random seed
}
# Theory paramters (theory_params)
theory_params = {
'dt': 0.1 # The time step of the mean-field theory integration, by default: 0.01
} Go back to Notebook structure
M = MultiAreaModel(network_params,
simulation=True,
sim_spec=sim_params,
theory=True,
theory_spec=theory_params)Initializing network from dictionary.
RAND_DATA_LABEL 8418
Error in library("aod") : there is no package called ‘aod’
Execution halted
No R installation or IndexError, taking hard-coded SLN fit parameters.
========================================
Customized parameters
--------------------
{'K_scaling': 0.005,
'N_scaling': 0.005,
'connection_params': {'K_stable': 'K_stable.npy',
'av_indegree_V1': 3950.0,
'fac_nu_ext_5E': 1.125,
'fac_nu_ext_6E': 1.41666667,
'fac_nu_ext_TH': 1.2,
'g': -11.0,
'replace_non_simulated_areas': 'het_poisson_stat'},
'fullscale_rates': 'tests/fullscale_rates.json',
'input_params': {'rate_ext': 10.0},
'neuron_params': {'V0_mean': -150.0, 'V0_sd': 50.0}}
========================================
Simulation label: 27d81076e6d6e9e591684be053078477
Copied files.
Initialized simulation class.
p, r = M.theory.integrate_siegert()
print("Mean-field theory predicts an average "
"firing rate of {0:.3f} spikes/s across all populations.".format(np.mean(r[:, -1])))Iteration: 0
Mean-field theory predicts an average firing rate of 29.588 spikes/s across all populations.
The connectivity and neuron numbers are stored in the attributes of the model class. Neuron numbers are stored in M.N as a dictionary (and in M.N_vec as an array), indegrees in M.K as a dictionary (and in M.K_matrix as an array). Number of synapses can also be access via M.synapses (and in M.syn_matrix as an array).
# Indegrees
# Dictionary of nodes indegrees organized as:
# {<source_area>: {<source_pop>: {<target_area>: {<target_pop>: indegree_values}}}}
# M.K# Synapses
# Dictionary of synapses that target neurons receive, it is organized as:
# {<source_area>: {<source_pop>: {<target_area>: {<target_pop>: number_of_synapses}}}}
# M.synapsesGo back to Notebook structure
# run the simulation, depending on the model parameter and downscale ratio, the running time varies largely.
M.simulation.simulate()Prepared simulation in 0.00 seconds.
Rank 0: created area V1 with 0 local nodes
Memory after V1 : 1911.95 MB
Rank 0: created area V2 with 0 local nodes
Memory after V2 : 1938.52 MB
Rank 0: created area VP with 0 local nodes
Memory after VP : 1967.82 MB
Rank 0: created area V3 with 0 local nodes
Memory after V3 : 1996.12 MB
Rank 0: created area V3A with 0 local nodes
Memory after V3A : 2015.91 MB
Rank 0: created area MT with 0 local nodes
Memory after MT : 2041.57 MB
Rank 0: created area V4t with 0 local nodes
Memory after V4t : 2066.47 MB
Rank 0: created area V4 with 0 local nodes
Memory after V4 : 2093.54 MB
Rank 0: created area VOT with 0 local nodes
Memory after VOT : 2118.73 MB
Rank 0: created area MSTd with 0 local nodes
Memory after MSTd : 2140.20 MB
Rank 0: created area PIP with 0 local nodes
Memory after PIP : 2161.68 MB
Rank 0: created area PO with 0 local nodes
Memory after PO : 2183.06 MB
Rank 0: created area DP with 0 local nodes
Memory after DP : 2203.33 MB
Rank 0: created area MIP with 0 local nodes
Memory after MIP : 2224.90 MB
Rank 0: created area MDP with 0 local nodes
Memory after MDP : 2246.42 MB
Rank 0: created area VIP with 0 local nodes
Memory after VIP : 2268.23 MB
Rank 0: created area LIP with 0 local nodes
Memory after LIP : 2292.30 MB
Rank 0: created area PITv with 0 local nodes
Memory after PITv : 2317.64 MB
Rank 0: created area PITd with 0 local nodes
Memory after PITd : 2342.85 MB
Rank 0: created area MSTl with 0 local nodes
Memory after MSTl : 2364.20 MB
Rank 0: created area CITv with 0 local nodes
Memory after CITv : 2383.50 MB
Rank 0: created area CITd with 0 local nodes
Memory after CITd : 2402.79 MB
Rank 0: created area FEF with 0 local nodes
Memory after FEF : 2424.18 MB
Rank 0: created area TF with 0 local nodes
Memory after TF : 2439.86 MB
Rank 0: created area AITv with 0 local nodes
Memory after AITv : 2462.57 MB
Rank 0: created area FST with 0 local nodes
Memory after FST : 2479.30 MB
Rank 0: created area 7a with 0 local nodes
Memory after 7a : 2500.48 MB
Rank 0: created area STPp with 0 local nodes
Memory after STPp : 2519.23 MB
Rank 0: created area STPa with 0 local nodes
Memory after STPa : 2538.34 MB
Rank 0: created area 46 with 0 local nodes
Memory after 46 : 2553.71 MB
Rank 0: created area AITd with 0 local nodes
Memory after AITd : 2576.39 MB
Rank 0: created area TH with 0 local nodes
Memory after TH : 2588.98 MB
Created areas and internal connections in 2.30 seconds.
Created cortico-cortical connections in 22.75 seconds.
Simulated network in 74.33 seconds.
Go back to Notebook structure
label_spikes = M.simulation.label
label = M.simulation.label
from MAM2EBRAINS_LOAD_DATA import load_data
A, tsteps, firing_rate = load_data(M)loading spikes
Loading data from file
Computing population rates done
Loading data from file
Computing synchrony done
Loading data from file
Computing population LvR done
Loading data from file
Loading data from file
Computing rate time series done
pop_LvR
pop_rates
synchrony
Go back to Notebook structure
from MAM2EBRAINS_VISUALIZATION import plot_instan_mean_firing_rate
plot_instan_mean_firing_rate(tsteps, firing_rate, sim_params)Fig 5. Resting state of the model with χ =1.9. (A-C) Raster plot of spiking activity of 3% of the neurons in area V1 (A), V2 (B), and FEF (C). Blue: excitatory neurons, red: inhibitory neurons. (D-F) Spiking statistics across all 32 areas for the respective populations shown as area-averaged box plots. Crosses: medians, boxes: interquartile range (IQR), whiskers extend to the most extremeobservat ions within 1.5×IQR beyond the IQR. (D) Population-averaged firing rates. (E) Average pairwise correlation coefficients of spiking activity. (F) Irregularity measured by revised local variation LvR averaged across neurons. (G) Area-averaged firing rates, shown as raw binned spike histograms with 1ms bin width (gray) and convolved histograms, with aGaussian kernel (black) of optimal width.
from MAM2EBRAINS_VISUALIZATION import plot_resting_state
plot_resting_state(M, A, label_spikes, data_path, sim_params)# area_list = ['V1', 'V2', 'VP', 'V3', 'V3A', 'MT', 'V4t', 'V4', 'VOT', 'MSTd', 'PIP', 'PO', 'DP', 'MIP', 'MDP', 'VIP', 'LIP', 'PITv', 'PITd', 'MSTl', 'CITv', 'CITd', 'FEF', 'TF', 'AITv', 'FST', '7a', 'STPp', 'STPa', '46', 'AITd', 'TH']
# output = {'pdf', 'png', 'eps'}, optional
A.show_rates()0 V1
1 V2
2 VP
3 V3
4 PIP
5 V3A
6 MT
7 V4t
8 V4
9 PO
10 VOT
11 DP
12 MIP
13 MDP
14 MSTd
15 VIP
16 LIP
17 PITv
18 PITd
19 AITv
20 MSTl
21 FST
22 CITv
23 CITd
24 7a
25 STPp
26 STPa
27 FEF
28 46
29 TF
30 TH
31 AITd
['23E', '23I', '4E', '4I', '5E', '5I', '6E', '6I']
Go back to Notebook structure