Source code for neuron_morphology.features.layer.layered_point_depths
from typing import Sequence
import os
import pandas as pd
[docs]class LayeredPointDepths:
DF_COLS = {
"ids", "layer_name", "depth", "local_layer_pia_side_depth",
"local_layer_wm_side_depth", "point_type"
}
def __init__(
self,
ids: Sequence,
layer_name: Sequence[str],
depth: Sequence,
local_layer_pia_side_depth: Sequence,
local_layer_wm_side_depth: Sequence,
point_type: Sequence
):
""" Represents the depths from pia of a collection of cortical points.
Units are not specified, but should agree with those used in e.g.
ReferenceLayerDepths.
Parameters
----------
ids : Unique identifiers for these points. e.g. node ids
layer_name : For each point, the name of the layer containing that
point.
depth : For each point, the distance from the pia surface to that
point. The distance metric need not be the euclidean distance, but
ought to be measured consistently across points and surfaces.
local_layer_pia_side_depth : For each point, the distance between the
intersection of the shortest path to pia (according to a consistent
distance metric) and the upper surface of the layer containing the
point.
local_layer_wm_side_depth : as local_layer_pia_side_depths, on the
white matter side. In the case of nodes that are themselves in
white matter, this should be nan.
point_type : For each point, a value indicating the type of object
represented by that point (e.g. neuron_morphology.constants.AXON,
or "axon_terminal")
"""
self.df = pd.DataFrame({
"layer_name": layer_name,
"depth": depth,
"local_layer_pia_side_depth": local_layer_pia_side_depth,
"local_layer_wm_side_depth": local_layer_wm_side_depth,
"point_type": point_type
}, index=pd.Index(name="ids", data=ids))
[docs] def to_csv(self, path: str):
self.df.to_csv(path)
[docs] @classmethod
def from_dataframe(cls, df: pd.DataFrame):
data = df.reset_index()
for colname in data.columns:
if colname not in cls.DF_COLS:
data.drop(columns=[colname], inplace=True)
return cls(**data.to_dict(orient="list"))
[docs] @classmethod
def from_csv(cls, path: str):
return cls.from_dataframe(pd.read_csv(path))
[docs] @classmethod
def from_hdf5(cls, path: str):
return cls.from_dataframe(pd.read_hdf(path))
[docs] @classmethod
def read(cls, path: str):
extension = os.path.splitext(path)[1]
if extension == ".csv":
return cls.from_csv(path)
elif extension in (".h5", ".hdf", ".hdf5"):
return cls.from_hdf5(path)
else:
raise IOError(f"unrecognized extension: {extension}")