Source code for emodelrunner.morphology.morphology

"""Custom Morphology classes."""

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

# pylint: disable=unnecessary-comprehension
import logging

from bluepyopt import ephys

logger = logging.getLogger(__name__)


[docs] class SSCXNrnFileMorphology(ephys.morphologies.NrnFileMorphology): """Custom Morphology. Attributes: name (str): name of this object comment (str): comment morphology_path (str): location of the file describing the morphology do_replace_axon (bool): Does the axon need to be replaced by an AIS stub with default function ? replace_axon_hoc (str): Translation in HOC language for the 'replace_axon' method. This code will 'only' be used when calling create_hoc on a cell model. While the model is run in python, replace_axon is used instead. Must include 'proc replace_axon(){ ... } If None,the default replace_axon is used do_set_nseg (bool): if True, it will use nseg_frequency nseg_frequency (float): frequency of nseg morph_modifiers (list): list of functions to modify the icell with (sim, icell) as arguments morph_modifiers_hoc (list): list of hoc strings corresponding to morph_modifiers """
[docs] @staticmethod def replace_axon(sim=None, icell=None): """Replace axon. Args: sim (bluepyopt.ephys.NrnSimulator): neuron simulator icell (neuron cell): cell instantiation in simulator """ L_target = 60 # length of stub axon nseg0 = 5 # number of segments for each of the two axon sections nseg_total = nseg0 * 2 chunkSize = L_target / nseg_total diams = [] lens = [] count = 0 for section in icell.axonal: L = section.L nseg = 1 + int(L / chunkSize / 2.0) * 2 # nseg to get diameter section.nseg = nseg for seg in section: count = count + 1 diams.append(seg.diam) lens.append(L / nseg) if count == nseg_total: break if count == nseg_total: break for section in icell.axonal: sim.neuron.h.delete_section(sec=section) # new axon array sim.neuron.h.execute("create axon[2]", icell) L_real = 0 count = 0 for section in icell.axon: section.nseg = int(nseg_total / 2) section.L = L_target / 2 for seg in section: seg.diam = diams[count] L_real = L_real + lens[count] count = count + 1 icell.axonal.append(sec=section) icell.all.append(sec=section) icell.axon[0].connect(icell.soma[0], 1.0, 0.0) icell.axon[1].connect(icell.axon[0], 1.0, 0.0) sim.neuron.h.execute("create myelin[1]", icell) icell.myelinated.append(sec=icell.myelin[0]) icell.all.append(sec=icell.myelin[0]) icell.myelin[0].nseg = 5 icell.myelin[0].L = 1000 icell.myelin[0].diam = diams[count - 1] icell.myelin[0].connect(icell.axon[1], 1.0, 0.0) logger.debug( "Replace axon with tapered AIS of length %d, target length was %d, diameters are %s", L_real, L_target, diams, )
[docs] class ThalamusNrnFileMorphology(ephys.morphologies.NrnFileMorphology): """Custom Morphology. Attributes: name (str): name of this object comment (str): comment morphology_path (str): location of the file describing the morphology do_replace_axon (bool): Does the axon need to be replaced by an AIS stub with default function ? replace_axon_hoc (str): Translation in HOC language for the 'replace_axon' method. This code will 'only' be used when calling create_hoc on a cell model. While the model is run in python, replace_axon is used instead. Must include 'proc replace_axon(){ ... } If None,the default replace_axon is used do_set_nseg (bool): if True, it will use nseg_frequency nseg_frequency (float): frequency of nseg morph_modifiers (list): list of functions to modify the icell with (sim, icell) as arguments morph_modifiers_hoc (list): list of hoc strings corresponding to morph_modifiers """
[docs] @staticmethod def replace_axon(sim=None, icell=None): """Replace axon. Args: sim (bluepyopt.ephys.NrnSimulator): neuron simulator icell (neuron cell): cell instantiation in simulator """ L_target = 60 # length of stub axon nseg0 = 5 # number of segments for each of the two axon sections nseg_total = nseg0 * 2 chunkSize = L_target / nseg_total diams = [] lens = [] count = 0 for section in icell.axonal: L = section.L nseg = 1 + int(L / chunkSize / 2.0) * 2 # nseg to get diameter section.nseg = nseg for seg in section: count = count + 1 diams.append(seg.diam) lens.append(L / nseg) if count == nseg_total: break if count == nseg_total: break # Work-around if axon is too short lasti = -2 # Last diam. may be bigger if axon cut if len(diams) < nseg_total: diams = diams + [diams[lasti]] * (nseg_total - len(diams)) lens = lens + [lens[lasti]] * (nseg_total - len(lens)) if nseg_total - len(diams) > 5: logger.debug( "Axon too short, adding more than 5 sections with fixed diam" ) for section in icell.axonal: sim.neuron.h.delete_section(sec=section) # new axon array sim.neuron.h.execute("create axon[2]", icell) L_real = 0 count = 0 for section in icell.axon: section.nseg = int(nseg_total / 2) section.L = L_target / 2 for seg in section: seg.diam = diams[count] L_real = L_real + lens[count] count = count + 1 icell.axonal.append(sec=section) icell.all.append(sec=section) icell.axon[0].connect(icell.soma[0], 1.0, 0.0) icell.axon[1].connect(icell.axon[0], 1.0, 0.0) logger.debug( "Replace axon with tapered AIS of length %d, target length was %d, diameters are %s", L_real, L_target, diams, )