Lineage and Cells

Source | API

The lineage module contains three essential classes: Lineage, which is a collection of Cell s, themselves composed of CellFeatures.

The purpose of Lineage is to store cell features (length, area, average fluorescence, etc.) and their lineage tree (who divided into who). For example, let’s load a position from the DeLTA test suite and see what the lineage looks like:

>>> # Load the position
>>> pos = delta.pipeline.Position.load_netcdf(
>>>     "tests/data/movie_2D_nd2/test_expected_results/Position000000.nc"
>>> )
>>> # Take the lineage from the first (and only) ROI
>>> lineage = pos.rois[0].lineage
>>> # Print it
>>> print(lineage)
frames    : ..........
cell #0001: ╺╼╼╼╼╼┮╼╼╼
cell #0002:       ┕╼╼╼

This compact representation of the lineage shows that there was one cell that divided into two after a few frames.

The two cells can be found in the cells dictionary of the lineage, under their cell ids. Let’s look at them in more detail:

mother = lineage.cells[1]
daughter = lineage.cells[2]

These objects are Cell objects. They can be queried for information as following:

# The mother has no mother, but the daughter does
assert mother.motherid is None
assert daughter.motherid == 1

# The daughter appeared on frame 6
assert daughter.first_frame == 6

# Let's check this information also from the mother's side
assert mother.daughterid(frame=5) is None
assert mother.daughterid(frame=6) == 2
assert mother.daughterid(frame=7) is None

Finally, the method Cell.features() returns an object containing all the morphological features of the cell at a given frame:

>>> print(mother.features(frame=4))
CellFeatures(
    new_pole=array([260, 341], dtype=int16),
    old_pole=array([260, 370], dtype=int16),
    length=37.0,
    width=7.0,
    area=200.5,
    perimeter=82.38477,
    fluo=array([], dtype=float32),
    edges='',
    growthrate_length=0.084183276,
    growthrate_area=0.06813244,
)

Note

A detailed description of the individual features, their signification and units, is available in the documentation page of CellFeatures.

Individual features can be accessed by fields:

assert mother.features(frame=4).area == 200.5

The Lineage class contains several methods that allow to manipulate the lineage in case of tracking errors: Lineage.split(), Lineage.merge(), Lineage.adopt(), Lineage.pivot().

For example, in case the mother-daughter relationships is erroneous, one can remove it with Lineage.adopt():

>>> print(lineage)
frames    : ..........
cell #0001: ╺╼╼╼╼╼┮╼╼╼
cell #0002:       ┕╼╼╼
>>> lineage.adopt(cellid=2, motherid=None)
>>> print(lineage)
frames    : ..........
cell #0001: ╺╼╼╼╼╼╼╼╼╼
cell #0002:       ╺╼╼╼

See also our results analysis examples