Skip to content

Cable Cell Morphologies

bcumming edited this page Mar 4, 2019 · 2 revisions

The current library interface for constructing cell morphologies needs improvement. The problems with the current approach include

  • No way to label segments and sub-regions of cells for later reference.
    • there are three existing "cable" types: sphere, dendrite and axon
    • these are implemented as classes that inherit from a an abstract segment base class.
    • to add a mechanism to every dendrite, for example, one has to iterate over all segments manually
    • see NeuronML, which allows the labeling of arbitrary parts of the cell morphology.
  • The morphology description includes information about the multi-compartment discretization, specifically the number of compartments per segment.
    • these should be separate
  • The term segment is used in a non-standard way. In Neuron a segment is a compartment, and in NeuroML a segment is the smallest atomic unit for constructing a cell.

Proposed structure

There are four different components required to construct a discretized multi-compartment cell, ready for simulation. The first three components describe the cell and its dynamics, and the fourth is meta-data pertaining to the numeric solution method:

  1. Morphologies: the cell morphology, described by a set of connected segments.
  2. Labels: subsets of the morphology, e.g. "dendrite", "soma", "hillock", "spine"
  3. Dynamics: ion channels, synapses, capacitance, resistance etc: assigned to labels, segments or branches.
  4. Discretization Meta-data: description of how the morphology should be decomposed into compartments for a specific discretization/numeric solver.

Morphologies

  • A morphology is composed of segments.
  • A segment is either
    • a sphere
    • linear cable segment
  • a spherical segment has:
    • a parent segment [compulsory]
    • a radius [compulsory]
    • a center [optional]
  • a cable segment has:
    • a parent segment [compulsory]
    • one of:
      • length and radius [cylinder]
      • length and proximal+distal radii [tapering cylinder]
      • explicit proximal+distal locations + radii
      • length+ distal radius [inherits proximal radius parent segment]
      • distal location+radius [inherits proximal radius and location from parent segment]
  • a spherical segment can't have spherical parent (how do you calculate the resistance or surface area between them?)
  • a cable segment with spherical parent must provide proximal radius

Open questions:

  1. NeuroML allows segments to attach at an arbitrary location on its parent: should we support this
    • I say yes.
  2. On a cable soma we need to be able to say which end of the cable a child segment attaches to.
    • This would be supported by allowing segments to attach at arbitrary locations.
# a spherical segment
seg 0 {
    parent(),           # empty parent indicates the root of tree
    center(0,0,0),
    radius(10)
}

# cable segment: fixed radius
seg 3 {
    parent(2),
    len(20),
    rad(0.5)
}

# cable segment: tapering
seg 3 {
    parent(2),
    len(20),
    prox rad(0.5),
    dist rad(0.2)
}

# cable segment: tapering
seg 3 {
    parent(2),
    prox pos(10, 2, 0, 0.5),
    dist pos(12, 4, 0, 0.2)
}

Proposed Approach

The approach would be to implement each of the components first in C++, then in Python.

  1. C++ API for morphologies, including both programatic and SWC inputs.
  2. Python wrapper for morphologies.
  3. C++ API for labels
  4. Python wrapper labels
  5. C++ API for dynamics
  6. Python wrapper for dynamics
  7. C++ API for discretization meta-data
  8. C++ implement FVM discretization using cell description and meta-data
  9. Design file format for describing cells
  10. C++ API for both input and output of the file format.
  11. Python wrapper for IO
  12. Python support for converting from PyNeuroML: can be used with step 10 to output file format from step 9.