Source code for bluecellulab.psegment

# Copyright 2023-2024 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.
"""Represent a NEURON Segment in Python (for drawing)."""

import neuron

from bluecellulab.neuron_interpreter import eval_neuron

type_colormap = {'apic': 'm', 'dend': 'r', 'soma': 'k', 'axon': 'b', 'myelin': 'g', 'unknown': 'c'}


[docs] class PSegment: """A python representation of a segment.""" def __init__(self, hsegment, parentsection): # import matplotlib as plt from matplotlib import colormaps self.hsegment = hsegment self.parentsection = parentsection self.L = self.parentsection.L / self.parentsection.hsection.nseg self.diam = self.hsegment.diam self.figure = None self.figX = None self.figY = None self.color_map = colormaps["hot"] self.ax = None self.patch = None self.plotvariable = None self.mechanism_names = [mechanism.name() for mechanism in hsegment] self.varbounds = None
[docs] def setupDraw(self, figure, x, y, variable=None, varbounds=None): """Set up the drawing of a segment.""" import matplotlib as plt self.figure = figure self.plotvariable = variable self.varbounds = varbounds self.ax = self.figure.gca() self.figX = x self.figY = y self.patch = plt.patches.Rectangle( [self.figX, self.figY], self.diam, self.L, facecolor=type_colormap[self.parentsection.section_type], edgecolor=type_colormap[self.parentsection.section_type]) self.ax.add_patch(self.patch)
[docs] def redraw(self): """Redraw a segment.""" if self.plotvariable: plotvariable_value = self.get_variable_value(self.plotvariable) if plotvariable_value is not None: self.patch.set_facecolor(self.color_map( (plotvariable_value - self.varbounds[0]) / (self.varbounds[1] - self.varbounds[0]))) else: self.patch.set_facecolor(self.color_map(1.0)) self.patch.set_hatch("/") self.ax.draw_artist(self.patch)
[docs] def get_variable_value(self, variable): """Get a variable value in a segment.""" if variable == "v" or neuron.h.execute1( "{%s.%s(%f)}" % ( neuron.h.secname(sec=self.parentsection.hsection), variable, self.hsegment.x, ), 0, ): return eval_neuron(f"self.hsegment.{variable}", self=self) else: return None