Source code for dendrotweaks.morphology.domains
# SPDX-FileCopyrightText: 2025 Poirazi Lab <dendrotweaks@dendrites.gr>
# SPDX-License-Identifier: MPL-2.0
[docs]
class Domain:
"""
A class representing
a morphological or functional domain in a neuron.
Parameters
----------
name : str
The name of the domain.
type_idx : int
The type index of the domain.
color : str
The color of the domain.
"""
def __init__(self, name, type_idx, color) -> None:
self._name = name
self._type_idx = type_idx
self._color = color
self._sections = []
def __repr__(self):
return f'<Domain({self.name}, {self.type_idx}, {self.color}, {len(self.sections)} sections)>'
def __getitem__(self, idx):
return self._sections[idx]
def __len__(self):
return len(self._sections)
def __iter__(self):
for sec in self._sections:
yield sec
def __contains__(self, sec):
return sec in self._sections
@property
def sections(self):
"""
A list of sections in the domain.
"""
return self._sections
@property
def name(self):
"""
The name of the domain.
"""
return self._name
@name.setter
def name(self, value):
self._name = value
for sec in self._sections:
for point in sec.points:
point.domain_name = value
@property
def type_idx(self):
"""
The type index of the domain.
"""
return self._type_idx
@type_idx.setter
def type_idx(self, value):
self._type_idx = value
for sec in self._sections:
for point in sec.points:
point.type_idx = value
@property
def color(self):
"""
The color of the domain.
"""
return self._color
@color.setter
def color(self, value):
self._color = value
for sec in self._sections:
for point in sec.points:
point.domain_color = value
[docs]
def add_section(self, sec: "Section"):
"""
Add a section to the domain.
Changes the domain attribute of the section.
Parameters
----------
sec : Section
The section to be added to the domain.
"""
if sec in self._sections:
warnings.warn(f'Section {sec} already in domain {self.name}.')
return
sec._domain = self
sec.idx_within_domain = len(self._sections)
for point in sec.points:
point.domain_name = self.name
point.type_idx = self.type_idx
point.domain_color = self.color
self._sections.append(sec)
[docs]
def remove_section(self, sec):
"""
Remove a section from the domain.
Sets the domain attribute of the section
to None.
Parameters
----------
sec : Section
The section to be removed from the domain.
"""
if sec not in self.sections:
warnings.warn(f'Section {sec} not in domain {self.name}.')
return
sec._domain = None
sec.idx_within_domain = None
for point in sec.points:
point.domain_name = None
point.type_idx = None
point.domain_color = None
if hasattr(sec, 'path_distance_within_domain'):
# Remove cached property if it exists
del sec.path_distance_within_domain
self._sections.remove(sec)
[docs]
def is_empty(self):
"""
Check if the domain is empty.
Returns
-------
bool
True if the domain is empty, False otherwise.
"""
return not bool(self._sections)