# -*- 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 do download
# TheVirtualBrain-Scientific Package (for simulators). See content of the
# documentation-folder for more details. See also http://www.thevirtualbrain.org
#
# (c) 2012-2022, 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 follows:
#
# Paula Sanz Leon, Stuart A. Knock, M. Marmaduke Woodman, Lia Domide,
# Jochen Mersmann, Anthony R. McIntosh, Viktor Jirsa (2013)
# The Virtual Brain: a simulator of primate brain network dynamics.
# Frontiers in Neuroinformatics (7:10. doi: 10.3389/fninf.2013.00010)
#
#
from tvb.adapters.simulator.subforms_mapping import SubformsEnum, get_ui_name_to_equation_dict
from tvb.datatypes.equations import *
from tvb.core.neotraits.forms import Form, FloatField, StrField
from tvb.basic.neotraits.api import Float
[docs]def get_ui_name_for_equation(equation_class):
equation_to_ui_name = dict((v, k) for k, v in get_ui_name_to_equation_dict().items())
return equation_to_ui_name.get(equation_class)
[docs]def get_ui_name_to_monitor_equation_dict():
eq_name_to_class = {
'HRF kernel: Gamma kernel': Gamma,
'HRF kernel: Difference of Exponentials': DoubleExponential,
'HRF kernel: Volterra Kernel': FirstOrderVolterra,
'HRF kernel: Mixture of Gammas': MixtureOfGammas
}
return eq_name_to_class
[docs]def get_equation_to_form_dict():
coupling_class_to_form = {
Linear: LinearEquationForm,
Gaussian: GaussianEquationForm,
DoubleGaussian: DoubleGaussianEquationForm,
Sigmoid: SigmoidEquationForm,
GeneralizedSigmoid: GeneralizedSigmoidEquationForm,
Sinusoid: SinusoidEquationForm,
Cosine: CosineEquationForm,
Alpha: AlphaEquationForm,
PulseTrain: PulseTrainEquationForm,
Gamma: GammaEquationForm,
DoubleExponential: DoubleExponentialEquationForm,
FirstOrderVolterra: FirstOrderVolterraEquationForm,
MixtureOfGammas: MixtureOfGammasEquationForm
}
return coupling_class_to_form
[docs]def get_form_for_equation(equation_class):
return get_equation_to_form_dict().get(equation_class)
[docs]class EquationForm(Form):
def __init__(self):
super(EquationForm, self).__init__()
self.equation = StrField(self.get_traited_equation().equation, disabled=True)
for param_key, param in self.get_traited_equation().parameters.default().items():
setattr(self, param_key, FloatField(Float(label=param_key, default=param), name=param_key))
[docs] def fill_from_post(self, form_data):
for field in self.fields:
if field.name in form_data:
field.fill_from_post(form_data)
[docs] def fill_trait_partially(self, datatype, fields = None):
if fields is None:
fields = []
for field_str in fields:
datatype.parameters[field_str] = getattr(self, field_str).value
[docs]class LinearEquationForm(EquationForm):
def __init__(self):
super(LinearEquationForm, self).__init__()
[docs] def fill_trait(self, datatype):
datatype.parameters['a'] = self.a.value
datatype.parameters['b'] = self.b.value
[docs] def fill_from_trait(self, trait):
self.a.data = trait.parameters['a']
self.b.data = trait.parameters['b']
[docs]class GaussianEquationForm(EquationForm):
def __init__(self):
super(GaussianEquationForm, self).__init__()
[docs] def fill_trait(self, datatype):
datatype.parameters['amp'] = self.amp.value
datatype.parameters['sigma'] = self.sigma.value
datatype.parameters['midpoint'] = self.midpoint.value
datatype.parameters['offset'] = self.offset.value
[docs] def fill_from_trait(self, trait):
self.amp.data = trait.parameters['amp']
self.sigma.data = trait.parameters['sigma']
self.midpoint.data = trait.parameters['midpoint']
self.offset.data = trait.parameters['offset']
[docs]class DoubleGaussianEquationForm(EquationForm):
def __init__(self):
super(DoubleGaussianEquationForm, self).__init__()
[docs] def fill_trait(self, datatype):
datatype.parameters['amp_1'] = self.amp_1.value
datatype.parameters['amp_2'] = self.amp_2.value
datatype.parameters['sigma_1'] = self.sigma_1.value
datatype.parameters['sigma_2'] = self.sigma_2.value
datatype.parameters['midpoint_1'] = self.midpoint_1.value
datatype.parameters['midpoint_2'] = self.midpoint_2.value
[docs] def fill_from_trait(self, trait):
self.amp_1.data = trait.parameters['amp_1']
self.amp_2.data = trait.parameters['amp_2']
self.sigma_1.data = trait.parameters['sigma_1']
self.sigma_2.data = trait.parameters['sigma_2']
self.midpoint_1.data = trait.parameters['midpoint_1']
self.midpoint_2.data = trait.parameters['midpoint_2']
[docs]class SigmoidEquationForm(EquationForm):
def __init__(self):
super(SigmoidEquationForm, self).__init__()
[docs] def fill_trait(self, datatype):
datatype.parameters['amp'] = self.amp.value
datatype.parameters['radius'] = self.radius.value
datatype.parameters['sigma'] = self.sigma.value
datatype.parameters['offset'] = self.offset.value
[docs] def fill_from_trait(self, trait):
self.amp.data = trait.parameters['amp']
self.radius.data = trait.parameters['radius']
self.sigma.data = trait.parameters['sigma']
self.offset.data = trait.parameters['offset']
[docs]class GeneralizedSigmoidEquationForm(EquationForm):
def __init__(self):
super(GeneralizedSigmoidEquationForm, self).__init__()
[docs] def fill_trait(self, datatype):
datatype.parameters['low'] = self.low.value
datatype.parameters['high'] = self.high.value
datatype.parameters['midpoint'] = self.midpoint.value
datatype.parameters['sigma'] = self.sigma.value
[docs] def fill_from_trait(self, trait):
self.low.data = trait.parameters['low']
self.high.data = trait.parameters['high']
self.midpoint.data = trait.parameters['midpoint']
self.sigma.data = trait.parameters['sigma']
[docs]class SinusoidEquationForm(EquationForm):
def __init__(self):
super(SinusoidEquationForm, self).__init__()
[docs] def fill_trait(self, datatype):
datatype.parameters['amp'] = self.amp.value
datatype.parameters['frequency'] = self.frequency.value
[docs] def fill_from_trait(self, trait):
self.amp.data = trait.parameters['amp']
self.frequency.data = trait.parameters['frequency']
[docs]class CosineEquationForm(EquationForm):
def __init__(self):
super(CosineEquationForm, self).__init__()
[docs] def fill_trait(self, datatype):
datatype.parameters['amp'] = self.amp.value
datatype.parameters['frequency'] = self.frequency.value
[docs] def fill_from_trait(self, trait):
self.amp.data = trait.parameters['amp']
self.frequency.data = trait.parameters['frequency']
[docs]class AlphaEquationForm(EquationForm):
def __init__(self):
super(AlphaEquationForm, self).__init__()
[docs] def fill_trait(self, datatype):
datatype.parameters['onset'] = self.onset.value
datatype.parameters['alpha'] = self.alpha.value
datatype.parameters['beta'] = self.beta.value
[docs] def fill_from_trait(self, trait):
self.onset.data = trait.parameters['onset']
self.alpha.data = trait.parameters['alpha']
self.beta.data = trait.parameters['beta']
[docs]class PulseTrainEquationForm(EquationForm):
def __init__(self):
super(PulseTrainEquationForm, self).__init__()
[docs] def fill_trait(self, datatype):
datatype.parameters['T'] = self.T.value
datatype.parameters['tau'] = self.tau.value
datatype.parameters['amp'] = self.amp.value
datatype.parameters['onset'] = self.onset.value
[docs] def fill_from_trait(self, trait):
self.T.data = trait.parameters['T']
self.tau.data = trait.parameters['tau']
self.amp.data = trait.parameters['amp']
self.onset.data = trait.parameters['onset']
[docs]class GammaEquationForm(EquationForm):
def __init__(self):
super(GammaEquationForm, self).__init__()
[docs] def fill_trait(self, datatype):
datatype.parameters['tau'] = self.tau.value
datatype.parameters['n'] = self.n.value
datatype.parameters['factorial'] = self.factorial.value
datatype.parameters['a'] = self.a.value
[docs] def fill_from_trait(self, trait):
self.tau.data = trait.parameters['tau']
self.n.data = trait.parameters['n']
self.factorial.data = trait.parameters['factorial']
self.a.data = trait.parameters['a']
[docs]class DoubleExponentialEquationForm(EquationForm):
def __init__(self):
super(DoubleExponentialEquationForm, self).__init__()
[docs] def fill_trait(self, datatype):
datatype.parameters['tau_1'] = self.tau_1.value
datatype.parameters['tau_2'] = self.tau_2.value
datatype.parameters['a'] = self.a.value
datatype.parameters['f_1'] = self.f_1.value
datatype.parameters['f_2'] = self.f_2.value
datatype.parameters['pi'] = self.pi.value
datatype.parameters['amp_1'] = self.amp_1.value
datatype.parameters['amp_2'] = self.amp_2.value
[docs] def fill_from_trait(self, trait):
self.tau_1.data = trait.parameters['tau_1']
self.tau_2.data = trait.parameters['tau_2']
self.a.data = trait.parameters['a']
self.f_1.data = trait.parameters['f_1']
self.f_2.data = trait.parameters['f_2']
self.pi.data = trait.parameters['pi']
self.amp_1.data = trait.parameters['amp_1']
self.amp_2.data = trait.parameters['amp_2']
[docs]class FirstOrderVolterraEquationForm(EquationForm):
def __init__(self):
super(FirstOrderVolterraEquationForm, self).__init__()
[docs] def fill_trait(self, datatype):
datatype.parameters['tau_s'] = self.tau_s.value
datatype.parameters['tau_f'] = self.tau_f.value
datatype.parameters['k_1'] = self.k_1.value
datatype.parameters['V_0'] = self.V_0.value
[docs] def fill_from_trait(self, trait):
self.tau_s.data = trait.parameters['tau_s']
self.tau_f.data = trait.parameters['tau_f']
self.k_1.data = trait.parameters['k_1']
self.V_0.data = trait.parameters['V_0']
[docs]class MixtureOfGammasEquationForm(EquationForm):
def __init__(self):
super(MixtureOfGammasEquationForm, self).__init__()
[docs] def fill_trait(self, datatype):
datatype.parameters['a_1'] = self.a_1.value
datatype.parameters['a_2'] = self.a_2.value
datatype.parameters['l'] = self.l.value
datatype.parameters['c'] = self.c.value
datatype.parameters['gamma_a_1'] = self.gamma_a_1.value
datatype.parameters['gamma_a_2'] = self.gamma_a_2.value
[docs] def fill_from_trait(self, trait):
self.a_1.data = trait.parameters['a_1']
self.a_2.data = trait.parameters['a_2']
self.l.data = trait.parameters['l']
self.c.data = trait.parameters['c']
self.gamma_a_1.data = trait.parameters['gamma_a_1']
self.gamma_a_2.data = trait.parameters['gamma_a_2']