Source code for jaxley.io.swc
# This file is part of Jaxley, a differentiable neuroscience simulator. Jaxley is
# licensed under the Apache License Version 2.0, see <https://www.apache.org/licenses/>
from typing import List, Optional
from jaxley.io.graph import build_compartment_graph, from_graph, to_swc_graph
from jaxley.modules import Cell
[docs]
def read_swc(
fname: str,
ncomp: Optional[int],
max_branch_len: Optional[float] = None,
min_radius: Optional[float] = None,
assign_groups: bool = True,
backend: str = "graph",
ignore_swc_tracing_interruptions: bool = True,
relevant_type_ids: Optional[List[int]] = None,
) -> Cell:
"""Reads SWC file into a `Cell`.
Jaxley assumes cylindrical compartments and therefore defines length and radius
for every compartment. The surface area is then 2*pi*r*length. For branches
consisting of a single traced point we assume for them to have area 4*pi*r*r.
Therefore, in these cases, we set length=2*r.
Args:
fname: Path to the swc file.
ncomp: The number of compartments per branch.
max_branch_len: If a branch is longer than this value it is split into two
branches.
min_radius: If the radius of a reconstruction is below this value it is clipped.
assign_groups: If True, then the identity of reconstructed points in the SWC
file will be used to generate groups `soma`, `axon`, `basal`, `apical`. See
here:
http://www.neuronland.org/NLMorphologyConverter/MorphologyFormats/SWC/Spec.html
backend: The backend to use. Currently only `graph` is supported.
ignore_swc_tracing_interruptions: Whether to ignore discontinuities in the swc
tracing order. If False, this will result in split branches at these points.
relevant_type_ids: All type ids that are not in this list will be ignored for
tracing the morphology. This means that branches which have multiple type
ids (which are not in `relevant_type_ids`) will be considered as one branch.
If `None`, we default to `[1, 2, 3, 4]`.
Returns:
A `Cell` object."""
if backend == "graph":
swc_graph = to_swc_graph(fname)
comp_graph = build_compartment_graph(
swc_graph,
ncomp=ncomp,
root=None,
min_radius=min_radius,
max_len=max_branch_len,
ignore_swc_tracing_interruptions=ignore_swc_tracing_interruptions,
relevant_type_ids=relevant_type_ids,
)
module = from_graph(
comp_graph,
assign_groups=assign_groups,
solve_root=None,
traverse_for_solve_order=True, # Traverse to fix potential tracing errors.
)
return module
else:
raise ValueError(f"Unknown backend: {backend}. Use either `custom` or `graph`.")