Source code for neuron_morphology.feature_extractor.feature_specialization
from typing import (
NamedTuple, Set, Dict, Any, Sequence, Type, List, TypeVar, Optional)
import abc
import copy as cp
from neuron_morphology.constants import (
AXON,
APICAL_DENDRITE,
BASAL_DENDRITE,
SOMA
)
from neuron_morphology.feature_extractor.mark import (
Mark,
RequiresAxon,
RequiresApical,
RequiresBasal,
RequiresDendrite,
AllNeuriteTypes
)
Fs = TypeVar("Fs", bound="FeatureSpecialization")
[docs]class FeatureSpecialization(metaclass=abc.ABCMeta):
@property
@abc.abstractmethod
def name(self) -> str:
pass
@property
@abc.abstractmethod
def marks(self) -> Set[Type[Mark]]:
pass
@property
@abc.abstractmethod
def kwargs(self) -> Dict[str, Any]:
pass
[docs] @classmethod
def factory(
cls: Type[Fs],
name: str,
marks: Set[Type[Mark]],
kwargs: Dict[str, Any],
display_name: Optional[str] = None
) -> Type[Fs]:
""" A utility for quickly generating feature specializations
Parameters
----------
name : The name of the generated class. If display_name is not
provided, this will also be used as the name attribute of the
generated class
marks : the marks which this specialization implies.
kwargs : the keyword argument values defining this specialization
display_name : if provided, the name attribute of the generated
specialization.
Returns
-------
A generated FeatureSpecialization subclass
"""
if display_name is None:
display_name = name
return type(
name,
(cls,),
{
"name": display_name,
"marks": cp.deepcopy(marks),
"kwargs": cp.deepcopy(kwargs)
}
)
SpecializationOption = Type[FeatureSpecialization]
SpecializationSet = Set[SpecializationOption]
SpecializationSets = List[SpecializationSet]
[docs]class AxonSpec(FeatureSpecialization):
name="axon"
marks={RequiresAxon}
kwargs={"node_types": [AXON]}
[docs]class ApicalDendriteSpec(FeatureSpecialization):
name="apical_dendrite"
marks={RequiresApical}
kwargs={"node_types": [APICAL_DENDRITE]}
[docs]class BasalDendriteSpec(FeatureSpecialization):
name="basal_dendrite"
marks={RequiresBasal}
kwargs={"node_types": [BASAL_DENDRITE]}
[docs]class DendriteSpec(FeatureSpecialization):
name="dendrite"
marks={RequiresDendrite}
kwargs={"node_types": [APICAL_DENDRITE, BASAL_DENDRITE]}
[docs]class AllNeuriteSpec(FeatureSpecialization):
name="all_neurites"
marks={AllNeuriteTypes}
kwargs={"node_types": None}
NEURITE_SPECIALIZATIONS = {
AxonSpec,
ApicalDendriteSpec,
BasalDendriteSpec,
DendriteSpec,
AllNeuriteSpec
}
[docs]class AxonCompareSpec(FeatureSpecialization):
name="axon"
marks={RequiresAxon}
kwargs={"node_types_to_compare": [AXON]}
[docs]class ApicalDendriteCompareSpec(FeatureSpecialization):
name="apical_dendrite"
marks={RequiresApical}
kwargs={"node_types_to_compare": [APICAL_DENDRITE]}
[docs]class BasalDendriteCompareSpec(FeatureSpecialization):
name="basal_dendrite"
marks={RequiresBasal}
kwargs={"node_types_to_compare": [BASAL_DENDRITE]}
[docs]class DendriteCompareSpec(FeatureSpecialization):
name="dendrite"
marks={RequiresDendrite}
kwargs={"node_types_to_compare": [APICAL_DENDRITE, BASAL_DENDRITE]}
[docs]class AllNeuriteCompareSpec(FeatureSpecialization):
name="all_neurites"
marks={AllNeuriteTypes}
kwargs={"node_types_to_compare": None}
NEURITE_COMPARISON_SPECIALIZATIONS = {
AxonCompareSpec,
ApicalDendriteCompareSpec,
BasalDendriteCompareSpec,
DendriteCompareSpec,
AllNeuriteCompareSpec
}