Source code for tvb.interfaces.web.controllers.burst.noise_configuration_controller
# -*- coding: utf-8 -*-
#
#
# TheVirtualBrain-Framework Package. This package holds all Data Management, and
# Web-UI helpful to run brain-simulations. To use it, you also need to download
# TheVirtualBrain-Scientific Package (for simulators). See content of the
# documentation-folder for more details. See also http://www.thevirtualbrain.org
#
# (c) 2012-2023, Baycrest Centre for Geriatric Care ("Baycrest") and others
#
# This program is free software: you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software Foundation,
# either version 3 of the License, or (at your option) any later version.
# This program 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 General Public License for more details.
# You should have received a copy of the GNU General Public License along with this
# program. If not, see <http://www.gnu.org/licenses/>.
#
#
# CITATION:
# When using The Virtual Brain for scientific publications, please cite it as explained here:
# https://www.thevirtualbrain.org/tvb/zwei/neuroscience-publications
#
#
"""
.. moduleauthor:: Mihai Andrei <mihai.andrei@codemart.ro>
"""
import json
import cherrypy
from tvb.adapters.visualizers.connectivity import ConnectivityViewer
from tvb.core.entities import load
from tvb.core.services.burst_config_serialization import SerializationManager
from tvb.interfaces.web.controllers import common
from tvb.interfaces.web.controllers.autologging import traced
from tvb.interfaces.web.controllers.burst.base_controller import BurstBaseController
from tvb.interfaces.web.controllers.decorators import expose_page, handle_error, check_user
from tvb.interfaces.web.controllers.simulator.simulator_wizzard_urls import SimulatorWizzardURLs
from tvb.interfaces.web.entities.context_simulator import SimulatorContext
[docs]@traced
class NoiseConfigurationController(BurstBaseController):
"""
Controller class for placing noise parameters in nodes.
"""
def __init__(self):
super(NoiseConfigurationController, self).__init__()
self.simulator_context = SimulatorContext()
[docs] @expose_page
def index(self):
des = SerializationManager(self.simulator_context.simulator)
conn_idx = load.load_entity_by_gid(des.conf.connectivity)
model = des.conf.model
integrator = des.conf.integrator
state_vars = model.state_variables
noise_values = self.init_noise_config_values(model, integrator, conn_idx)
initial_noise = self.group_noise_array_by_state_var(noise_values, state_vars, conn_idx.number_of_regions)
current_project = common.get_current_project()
params = ConnectivityViewer.get_connectivity_parameters(conn_idx, current_project.name,
str(conn_idx.fk_from_operation))
params.update({
'title': 'Noise configuration',
'mainContent': 'burst/noise',
'isSingleMode': True,
'submit_parameters_url': self.build_path('/burst/noise/submit'),
'stateVars': state_vars,
'stateVarsJson': json.dumps(state_vars),
'noiseInputValues': initial_noise[0],
'initialNoiseValues': json.dumps(initial_noise)
})
return self.fill_default_attributes(params, 'regionmodel')
[docs] @cherrypy.expose
@handle_error(redirect=True)
@check_user
def submit(self, node_values):
"""
Submit noise dispersions
:param node_values: A map from state variable names to noise dispersion arrays. Ex {'V': [1,2...74]}
"""
des = SerializationManager(self.simulator_context.simulator)
des.write_noise_parameters(json.loads(node_values))
self.simulator_context.add_last_loaded_form_url_to_session(SimulatorWizzardURLs.SET_NOISE_PARAMS_URL)
self.redirect("/burst/")
[docs] @staticmethod
def group_noise_array_by_state_var(noise_values, state_vars, number_of_regions):
initial_noise = []
for i in range(number_of_regions):
node_noise = {}
for sv_idx, sv in enumerate(state_vars):
node_noise[sv] = noise_values[sv_idx][i]
initial_noise.append(node_noise)
return initial_noise
[docs] @staticmethod
def init_noise_config_values(model, integrator, connectivity):
"""
Initialize a state var x number of nodes array with noise values.
"""
state_variables = model.state_variables
nr_nodes = connectivity.number_of_regions
nr_state_vars = len(state_variables)
try:
nsig = integrator.noise.nsig
noise_values = nsig.tolist()
except AttributeError:
# Just fallback to default
return [[1 for _ in range(nr_nodes)] for _ in state_variables]
if nsig.shape == (1,):
# Only one number for noise
return [noise_values * nr_nodes for _ in state_variables]
elif nsig.shape == (nr_state_vars, 1) or nsig.shape == (nr_state_vars,):
# Only one number per state variable
return [[noise_values[idx]] * nr_nodes for idx in range(nr_state_vars)]
elif nsig.shape == (nr_state_vars, nr_nodes):
return noise_values
else:
raise ValueError("Got unexpected noise shape %s." % (nsig.shape,))