Source code for emodelrunner.synapses.glusynapse
"""GluSynapse class."""
# Copyright 2020-2022 Blue Brain Project / EPFL
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from emodelrunner.synapses.synapse import SynapseMixin
[docs]
class GluSynapseCustom(SynapseMixin):
"""Attach a synapse to the simulation.
Attributes:
seed (int): random number generator seed number
rng_settins_mode (str) : mode of the random number generator
Can be "Random123" or "Compatibility"
section (neuron section): cell location where the synapse is attached to
hsynapse (neuron GluSynapse): Glusynapse instantion in simulator
delay (float): synapse delay
weight (float): synapse weight
pre_mtype (int): ID (but not gid) of the presynaptic cell
start (int/None): force synapse to start firing at given value when using NetStim
interval (int/None): force synapse to fire at given interval when using NetStim
number (int/None): force synapse to fire N times when using NetStim
noise (int/None): force synapse to have given noise when using NetStim
"""
def __init__(
self,
sim,
icell,
synapse,
section,
seed,
rng_settings_mode,
synconf_dict,
start=None,
interval=None,
number=None,
noise=None,
):
"""Constructor.
Args:
sim (NrnSimulator): simulator
icell (Hoc Cell): cell to which attach the synapse
synapse (dict): synapse data
section (neuron section): cell location where the synapse is attached to
seed (int): random number generator seed number
rng_settings_mode (str): mode of the random number generator
Can be "Random123" or "Compatibility"
synconf_dict (dict): synapse configuration
start (int/None): force synapse to start firing at given value when using NetStim
interval (int/None): force synapse to fire at given interval when using NetStim
number (int/None): force synapse to fire N times when using NetStim
noise (int/None): force synapse to have given noise when using NetStim
"""
# pylint: disable=too-many-arguments
self.seed = seed
self.rng_settings_mode = rng_settings_mode
self.section = section
# the synapse is inhibitory
if synapse["synapse_type"] < 100:
raise NotImplementedError()
# the synapse is excitatory
self.hsynapse = sim.neuron.h.GluSynapse(synapse["seg_x"], sec=self.section)
self.hsynapse.tau_d_AMPA = synapse["tau_d"]
self.hsynapse.Use0_TM = abs(synapse["use"])
self.hsynapse.Dep_TM = abs(synapse["dep"])
self.hsynapse.Fac_TM = abs(synapse["fac"])
self.hsynapse.synapseID = synapse["sid"]
self.hsynapse.Nrrp_TM = synapse["Nrrp"]
# set random number generator
self.set_random_nmb_generator(sim, icell, synapse["sid"])
self.execute_synapse_configuration(synconf_dict, synapse["sid"], sim)
self.delay = synapse["delay"]
self.weight = synapse["weight"]
self.pre_mtype = synapse["pre_mtype"]
# netstim params if given
self.start = start
self.interval = interval
self.number = number
self.noise = noise
# taken from glusynapseutils.simulation.simulator._runconnectedpair_process
[docs]
def set_local_params(self, fit_params, extra_params, c_pre=0.0, c_post=0.0):
"""Set local parameters of given synapse.
Args:
fit_params (dict): glusynapse parameters from fitting to get threshold values
extra_params (dict): contains synapse location and synapse extra parameters
c_pre (float): calcium peak during a single EPSP
c_post (float): calcium peak during a single bAP
"""
# Update basic synapse parameters
for param in extra_params:
if param == "loc":
continue
# Set parameter
setattr(self.hsynapse, param, extra_params[param])
# Update other parameters
if fit_params is not None:
if (
all(key in fit_params for key in ["a00", "a01"])
and extra_params["loc"] == "basal"
):
# Set basal depression threshold
self.hsynapse.theta_d_GB = (
fit_params["a00"] * c_pre + fit_params["a01"] * c_post
)
if (
all(key in fit_params for key in ["a10", "a11"])
and extra_params["loc"] == "basal"
):
# Set basal potentiation threshold
self.hsynapse.theta_p_GB = (
fit_params["a10"] * c_pre + fit_params["a11"] * c_post
)
if (
all(key in fit_params for key in ["a20", "a21"])
and extra_params["loc"] == "apical"
):
# Set apical depression threshold
self.hsynapse.theta_d_GB = (
fit_params["a20"] * c_pre + fit_params["a21"] * c_post
)
if (
all(key in fit_params for key in ["a30", "a31"])
and extra_params["loc"] == "apical"
):
# Set apical potentiation threshold
self.hsynapse.theta_p_GB = (
fit_params["a30"] * c_pre + fit_params["a31"] * c_post
)
# taken from glusynapse.simulation.simulator._runconnectedpair_process
[docs]
def setup_synapses(self, params):
"""Set local parameters of given synapse from params dict.
Args:
params (dict): contains
- fit_params: glusynapse parameters from fitting to get threshold values
- syn_extra_params: synapse location and synapse extra parameters
- c_pre: calcium peak during a single EPSP
- c_post: calcium peak during a single bAP
- postgid: ID of the postsynaptic cell
- invivo: whether to put synapse in 'in vivo' conditions
"""
syn_id = int(self.hsynapse.synapseID)
# Set local parameters
key = str((params["postgid"], syn_id))
self.set_local_params(
params["fit_params"],
params["syn_extra_params"][key],
params["c_pre"][key],
params["c_post"][key],
)
# Enable in vivo mode (synapse)
if params["invivo"]:
self.hsynapse.Use0_TM = 0.15 * self.hsynapse.Use0_TM
self.hsynapse.Use_d_TM = 0.15 * self.hsynapse.Use_d_TM
self.hsynapse.Use_p_TM = 0.15 * self.hsynapse.Use_p_TM