Source code for neuron_morphology.features.statistics.coordinates

from typing import Optional, List
from enum import Enum

from neuron_morphology.morphology import Morphology
from neuron_morphology.feature_extractor.marked_feature import marked
from neuron_morphology.feature_extractor.feature_specialization import FeatureSpecialization
from neuron_morphology.feature_extractor.mark import (
    Geometric,
    BifurcationFeatures,
    CompartmentFeatures,
    TipFeatures)


[docs]class COORD_TYPE(Enum): NODE = 0 COMPARTMENT = 1 BIFURCATION = 2 TIP = 3
[docs] def get_coordinates(self, morphology, node_types: Optional[List[int]] = None): fn = {COORD_TYPE.NODE: get_node_coordinates, COORD_TYPE.BIFURCATION: get_bifurcation_coordinates, COORD_TYPE.COMPARTMENT: get_compartment_coordinates, COORD_TYPE.TIP: get_tip_coordinates}.get(self) return fn(morphology, node_types=node_types)
[docs]class NodeSpec(FeatureSpecialization): name = "node" marks = set() kwargs = {"coord_type": COORD_TYPE.NODE}
[docs]class BifurcationSpec(FeatureSpecialization): name = "bifurcation" marks = {BifurcationFeatures} kwargs = {"coord_type": COORD_TYPE.BIFURCATION}
[docs]class CompartmentSpec(FeatureSpecialization): name = "compartment" marks = {CompartmentFeatures} kwargs = {"coord_type": COORD_TYPE.COMPARTMENT}
[docs]class TipSpec(FeatureSpecialization): name = "tip" marks = {TipFeatures} kwargs = {"coord_type": COORD_TYPE.TIP}
COORD_TYPE_SPECIALIZATIONS = { NodeSpec, BifurcationSpec, CompartmentSpec, TipSpec } @marked(Geometric) @marked(CompartmentFeatures) def get_compartment_coordinates(morphology, node_types: Optional[List[int]] = None): """ Return the coordinates of the midpoint of each compartment in the morphology Parameters ---------- morphology: Morphology object node_types: list (AXON, BASAL_DENDRITE, APICAL_DENDRITE) Returns ------- list: list of coordinates [x, y, z] """ comps = morphology.get_compartments() return [morphology.get_compartment_midpoint(comp) for comp in comps] @marked(Geometric) @marked(BifurcationFeatures) def get_bifurcation_coordinates(morphology, node_types: Optional[List[int]] = None): """ Return the coordinates of each bifurcation in the morphology Parameters ---------- morphology: Morphology object node_types: list (AXON, BASAL_DENDRITE, APICAL_DENDRITE) Returns ------- list: list of coordinates [x, y, z] """ bifs = morphology.get_branching_nodes(node_types=node_types) return [[bif['x'], bif['y'], bif['z']] for bif in bifs] @marked(Geometric) @marked(TipFeatures) def get_tip_coordinates(morphology, node_types: Optional[List[int]] = None): """ Return the coordinates of each tip in the morphology Parameters ---------- morphology: Morphology object node_types: list (AXON, BASAL_DENDRITE, APICAL_DENDRITE) Returns ------- list: list of coordinates [x, y, z] """ tips = morphology.get_leaf_nodes(node_types=node_types) return [[tip['x'], tip['y'], tip['z']] for tip in tips] @marked(Geometric) def get_node_coordinates(morphology, node_types: Optional[List[int]] = None): """ Return the coordinates of each node in the morphology Parameters ---------- morphology: Morphology object node_types: list (AXON, BASAL_DENDRITE, APICAL_DENDRITE) Returns ------- list: list of coordinates [x, y, z] """ nodes = morphology.get_node_by_types(node_types=node_types) return [[node['x'], node['y'], node['z']] for node in nodes] @marked(Geometric) def get_coordinates( morphology: Morphology, coordinate_type: COORD_TYPE = COORD_TYPE.NODE, node_types: Optional[List[int]] = None): return coordinate_type.get_coordinates(morphology, node_types=node_types)