Source code for arborize.schematics._bsb
import itertools
import typing
from ..schematic import Schematic
if typing.TYPE_CHECKING: # pragma: nocover
import bsb.morphologies
from ..definitions import Definition
[docs]
def bsb_schematic(
morphology: "bsb.morphologies.Morphology",
definitions: typing.Optional["Definition"] = None,
) -> Schematic:
"""
Generate a schematic from a bsb.Morphology object.
:param morphology: A bsb.Morphology instance.
:type morphology: bsb.morphologies.Morphology
:param definitions: Optional Definition instance.
:type definitions: arborize.definitions.Definition
:return: A schematic representation.
:rtype: arborize.schematic.Schematic
"""
schematic = Schematic(name=morphology.meta.get("name"))
branches: list[bsb.morphologies.Branch] = [*morphology.branches]
endpoints = []
for bid, branch in enumerate(branches):
branch._tempid = bid
if not len(branch):
true_parent = None
while True:
parent = branch.parent
if parent is None:
break
elif len(parent):
true_parent = endpoints[parent._tempid]
break
schematic.create_empty()
endpoints.append(true_parent)
else:
if branch.parent is not None:
endpoint = endpoints[branch.parent._tempid]
else:
endpoint = None
for pid, coords, radius, labels in zip(
itertools.count(), branch.points, branch.radii, branch.labels.walk()
):
endpoint = endpoint if pid == 0 else None
schematic.create_location((bid, pid), coords, radius, [*labels], endpoint)
endpoints.append((bid, pid))
if definitions is not None:
schematic.definition = definitions
return schematic