Source code for bsb.cell_types

"""
    Module for the CellType configuration node and its dependencies.
"""

import typing

from . import config
from ._util import obj_str_insert
from .config import types
from .placement.indicator import PlacementIndications

if typing.TYPE_CHECKING:
    from .core import Scaffold


[docs] @config.node class Plotting: scaffold: "Scaffold" display_name = config.attr() """ Label used to display this cell type in plots. """ color = config.attr() """ Color used to display this cell type in plots. """ opacity = config.attr(type=types.fraction(), default=1.0) """ Opacity used to display this cell type in plots. """
def _not_an_entity(section): return "entity" not in section or not bool(section["entity"])
[docs] @config.node class CellType: """ Information on a population of cells. """ scaffold: "Scaffold" name = config.attr(key=True) """ Name of the cell type, equivalent to the key it occurs under in the configuration. """ spatial = config.attr( type=PlacementIndications, required=_not_an_entity, default={"radius": None} ) """ Spatial information about the cell type such as radius and density, and geometric or morphological information. """ plotting = config.attr(type=Plotting) """ Plotting information about the cell type, such as color and labels. """ entity = config.attr(type=bool, default=False) """ Whether this cell type is an entity type. Entity types don't have representations in space, but can still be connected and simulated. """ def __boot__(self): storage = self.scaffold.storage if storage.supports("PlacementSet"): storage.require_placement_set(self) def __lt__(self, other): try: return self.name < other.name except Exception: return True @obj_str_insert def __repr__(self): try: placements = len(self.get_placement()) except Exception: placements = "?" try: cells_placed = len(self.get_placement_set()) except Exception: cells_placed = 0 return f"'{self.name}', {cells_placed} cells, {placements} placement strategies"
[docs] def get_placement(self): """ Get the placement components this cell type is a part of. """ return self.scaffold.get_placement_of(self)
[docs] def get_placement_set(self, *args, **kwargs): """ Retrieve this cell type's placement data :param chunks: When given, restricts the placement data to these chunks. :type chunks: List[bsb.storage._chunks.Chunk] """ return self.scaffold.get_placement_set(self, *args, **kwargs)
[docs] def get_morphologies(self): """ Return the list of morphologies of this cell type. :rtype: List[~bsb.storage.interfaces.StoredMorphology] """ if "morphologies" not in self.spatial: return [] else: return self.scaffold.storage.morphologies.select(*self.spatial.morphologies)
[docs] def clear(self): """ Clear all the placement and connectivity data associated with this cell type. """ self.clear_placement() self.clear_connections()
[docs] def clear_placement(self): """ Clear all the placement data associated with this cell type. Connectivity data will remain, but be invalid. """ self.get_placement_set().clear()
[docs] def clear_connections(self): """ Clear all the connectivity data associated with this cell type. Any connectivity set that this cell type is a part of will be entirely removed. """ for conn_set in self.scaffold.get_connectivity_sets(): if self is conn_set.pre_type or self is conn_set.post_type: conn_set.clear()
# This property was mostly added so that accidental assignment to `ct.morphologies` # instead of `ct.spatial.morphologies` raises an error. @property def morphologies(self): return self.get_morphologies() @morphologies.setter def morphologies(self, value): raise AttributeError( "`cell_type.morphologies` is a readonly attribute. Did you mean" " `cell_type.spatial.morphologies`?" )
__all__ = ["CellType", "PlacementIndications", "Plotting"]