Lineage and Cells¶
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