"""Run pair simulation for synapse plasticity simulation."""
# 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.
import json
import logging
import numpy as np
from bluepyopt import ephys
from emodelrunner.create_cells import get_precell, get_postcell
from emodelrunner.parsing_utilities import get_parser_args, set_verbosity
from emodelrunner.protocols.create_protocols import define_pairsim_protocols
from emodelrunner.load import get_release_params
from emodelrunner.load import get_syn_setup_params
from emodelrunner.load import load_config
from emodelrunner.output import write_synplas_output
from emodelrunner.output import write_synplas_precell_output
from emodelrunner.run_synplas import _set_global_params
# Configure logger
logger = logging.getLogger(__name__)
[docs]
def run(
config_path,
cvode_active=True,
postsyn_protocol_name="pulse",
presyn_protocol_name="presyn_pulse",
fixhp=True,
):
"""Run cell with pulse stimuli and pre-cell spike train.
Args:
config_path (str): path to config file
cvode_active (bool): whether to use variable time step
postsyn_protocol_name (str): name of the postsynaptic protocol
presyn_protocol_name (str): name of the presynaptic protocol
fixhp (bool): to uninsert SK_E2 for hyperpolarization in cell model
"""
# pylint:disable=too-many-locals
config = load_config(config_path=config_path)
# load extra_params
syn_setup_params = get_syn_setup_params(
"synapses/syn_extra_params.json",
"synapses/cpre_cpost.json",
config.get("Paths", "synplas_fit_params_path"),
config.getint("Cell", "gid"),
config.getboolean("SynapsePlasticity", "invivo"),
)
# load cell
postcell = get_postcell(
config,
fixhp=fixhp,
syn_setup_params=syn_setup_params,
)
# load cell
precell = get_precell(
config,
fixhp=fixhp,
)
sim = ephys.simulators.NrnSimulator(cvode_active=cvode_active)
pre_release_params = get_release_params(config, precell=True)
post_release_params = get_release_params(config)
# set dynamic timestep tolerance
sim.neuron.h.cvode.atolscale("v", 0.1) # 0.01 for more precision
# load spike_train
spike_train_path = config.get("Paths", "spiketrain_path")
pre_spike_train = np.unique(np.loadtxt(spike_train_path, skiprows=1)[:, 0])
# get pre-synaptic stimulus parameters
presyn_stim_args = config.presyn_stim_args(pre_spike_train)
# Set fitted model parameters
if syn_setup_params["fit_params"]:
_set_global_params(syn_setup_params["fit_params"], sim)
# Enable in vivo mode (global)
if config.getboolean("SynapsePlasticity", "invivo"):
sim.neuron.h.cao_CR_GluSynapse = 1.2 # mM
# protocols
protocol = define_pairsim_protocols(
postcell,
presyn_protocol_name,
postsyn_protocol_name,
cvode_active,
json.loads(config.get("SynapsePlasticity", "synrec")),
config.getfloat("Protocol", "tstop"),
config.getfloat("SynapsePlasticity", "fastforward"),
presyn_stim_args,
config.get("Paths", "stimuli_path"),
)
# run
logger.info("Python Recordings Running...")
responses = protocol.run(
precell_model=precell,
postcell_model=postcell,
pre_param_values=pre_release_params,
post_param_values=post_release_params,
sim=sim,
isolate=False,
)
# write responses
output_path = config.get("Paths", "pairsim_output_path")
precell_output_path = config.get("Paths", "pairsim_precell_output_path")
syn_prop_path = config.get("Paths", "syn_prop_path")
write_synplas_output(responses[1], pre_spike_train, output_path, syn_prop_path)
write_synplas_precell_output(
responses[0], presyn_protocol_name, precell_output_path
)
logger.info("Python Recordings Done.")
logger.info("Responses written to %s", output_path)
if __name__ == "__main__":
args = get_parser_args()
set_verbosity(args.verbosity)
run(config_path=args.config_path)