Skip to content
Snippets Groups Projects
Select Git revision
  • 347989d977f23267b921fe9522b3f68446fbb7e6
  • master default protected
  • noelp-master-patch-87404
  • disable-view
  • experimental_rel
  • test_quiggeldy_service
  • update-arbor-0.10.0
  • image_build
  • spack_v0.22.1
  • ebrains-24-04
  • update-readme
  • create-module-file
  • add-nestml-tests
  • feat_add_py-norse
  • update-libneuroml
  • update-bluebrain-packages
  • feat_arbor_install_all_binaries
  • ebrains-23.09-jsc-site-config
  • spack-v0.20.0
  • ebrains-23-09-spack-v0.19.2
  • ebrains-23-09
21 results

create_JupyterLab_kernel.sh

Blame
  • multi-area-model.ipynb 184.83 KiB

    Down-scaled multi-area model

    S0. Configuration

    In [1]:
    # 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"
    ''')
    In [2]:
    %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')
    Out [2]:
    
                  -- 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.
    
    
    In [3]:
    !pip install nested_dict dicthash
    Out [3]:
    Requirement 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)
    
    In [4]:
    # 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")
    Out [4]:

    S1. Parameterization

    1.1. Parameters to tune

    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$
    1. scale_down_to
      scale_down_to is 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 if 1. meaning full scale simulation.
      In the pre-set downscale version, it's set as 0.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
    2. cc_weights_factor
      This scaling factor controls the cortico-cortical synaptic strength.
      By default it's set as 1.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.
    3. areas_simulated
      This parameter specifies the cortical areas included in the simulation process. Its default value is complete_area_list meaning 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.
    4. replace_non_simulated_areas
      The paramter replace_non_simulated_areas defines how non-simulated areas will be replaced.
      It's set as None by 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.
    In [5]:
    # 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'

    1.2. Default parameters

    We try our best not to confuse users with too many parameters. However, if you want to change more parameters and explore the model, you can do so by passing a dictionary to the default_params argument of the MultiAreaModel class.

    In [6]:
    # 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
    } 

    S2. Multi-Area Model Instantiation and Simulation

    2.1. Insantiate a multi-area model

    In [7]:
    M = MultiAreaModel(network_params, 
                       simulation=True,
                       sim_spec=sim_params,
                       theory=True,
                       theory_spec=theory_params)
    Out [7]:
    Initializing network from dictionary.
    RAND_DATA_LABEL 8418
    
    Out [7]:
    Error in library("aod") : there is no package called ‘aod’
    Execution halted
    
    Out [7]:
    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.
    

    2.2. Predict firing rates from theory

    In [8]:
    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])))
    Out [8]:
    Iteration: 0
    Mean-field theory predicts an average firing rate of 29.588 spikes/s across all populations.
    

    2.3. Extract and visualize interareal connectivity

    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).

    In [9]:
    # Indegrees
    # Dictionary of nodes indegrees organized as:
    # {<source_area>: {<source_pop>: {<target_area>: {<target_pop>: indegree_values}}}}
    # M.K
    In [10]:
    # Synapses
    # Dictionary of synapses that target neurons receive, it is organized as:
    # {<source_area>: {<source_pop>: {<target_area>: {<target_pop>: number_of_synapses}}}}
    # M.synapses

    2.4. Run a simulation

    In [11]:
    # run the simulation, depending on the model parameter and downscale ratio, the running time varies largely.
    M.simulation.simulate()
    Out [11]:
    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.
    

    S3. Data Loading and Processing

    In [12]:
    label_spikes = M.simulation.label
    label = M.simulation.label
    
    from MAM2EBRAINS_LOAD_DATA import load_data
    A, tsteps, firing_rate = load_data(M)
    Out [12]:
    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
    

    S4. Simulation Results Visualziation

    4.1. Instantaneous and mean firing rate across all populations

    In [13]:
    from MAM2EBRAINS_VISUALIZATION import plot_instan_mean_firing_rate
    plot_instan_mean_firing_rate(tsteps, firing_rate, sim_params)
    out [13]:

    4.2 Resting state plots

    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.

    In [14]:
    from MAM2EBRAINS_VISUALIZATION import plot_resting_state
    plot_resting_state(M, A, label_spikes, data_path, sim_params)
    out [14]:

    4.3 Time-averaged population rates

    Plot overview over time-averaged population rates encoded in colors with areas along x-axis and populations along y-axis.

    In [15]:
    # 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()
    Out [15]:
    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']