In [1]:
Copied!
from pathlib import Path
import utils
import trackmate_utils
import holoviews as hv
import panel as pn
pn.extension()
from pathlib import Path
import utils
import trackmate_utils
import holoviews as hv
import panel as pn
pn.extension()
1. Load & View Data¶
Define data paths, read stacks & view a single frame
In [2]:
Copied!
base_data_path = Path(r"data/fucci_60_frames")
red_stack_path = base_data_path / 'red.tif'
green_stack_path = base_data_path / 'green.tif'
red_stack = utils.read_stack(red_stack_path)
green_stack = utils.read_stack(green_stack_path)
base_data_path = Path(r"data/fucci_60_frames")
red_stack_path = base_data_path / 'red.tif'
green_stack_path = base_data_path / 'green.tif'
red_stack = utils.read_stack(red_stack_path)
green_stack = utils.read_stack(green_stack_path)
In [3]:
Copied!
utils.view_stacks([red_stack, green_stack],
frame=0)
utils.view_stacks([red_stack, green_stack],
frame=0)
Out[3]:
2. Segmentation (CellPose)¶
Define paths to CellPose models and segment each channel individually
In [4]:
Copied!
base_model_path = Path(r"models")
red_segmentation_model = base_model_path / 'cellpose/nuclei_red_v2'
green_segmentation_model = base_model_path / 'cellpose/nuclei_green_v2'
base_model_path = Path(r"models")
red_segmentation_model = base_model_path / 'cellpose/nuclei_red_v2'
green_segmentation_model = base_model_path / 'cellpose/nuclei_green_v2'
In [5]:
Copied!
# red_segmented = utils.segment_stack(red_stack_path, red_segmentation_model)
# green_segmented = utils.segment_stack(green_stack_path, green_segmentation_model)
# red_segmented = utils.segment_stack(red_stack_path, red_segmentation_model)
# green_segmented = utils.segment_stack(green_stack_path, green_segmentation_model)
Read & view the segmentation map, where each color indicates a distinct cell
In [6]:
Copied!
red_segmented_stack = utils.read_stack(base_data_path / 'red_segmented.tiff')
green_segmented_stack = utils.read_stack(base_data_path / 'green_segmented.tiff')
utils.view_segmented_stacks([red_segmented_stack, green_segmented_stack],
frame=0)
red_segmented_stack = utils.read_stack(base_data_path / 'red_segmented.tiff')
green_segmented_stack = utils.read_stack(base_data_path / 'green_segmented.tiff')
utils.view_segmented_stacks([red_segmented_stack, green_segmented_stack],
frame=0)
Out[6]:
Overlay segmentation map over raw data
In [7]:
Copied!
utils.view_segmentation_overlay([red_stack, green_stack],
[red_segmented_stack, green_segmented_stack],
frame=1)
utils.view_segmentation_overlay([red_stack, green_stack],
[red_segmented_stack, green_segmented_stack],
frame=1)
Out[7]:
3. Individual Cell Tracking (TrackMate)¶
Define paths to segmentation maps, TrackMate config file and run tracking
In [8]:
Copied!
trackmate_settings_xml = base_model_path / Path(r"trackmate/basic_settings.xml")
red_segmented_path = base_data_path / 'red_segmented.tiff'
green_segmented_path = base_data_path / 'green_segmented.tiff'
# utils.run_trackmate(trackmate_settings_xml, red_segmented_path)
# utils.run_trackmate(trackmate_settings_xml, green_segmented_path)
trackmate_settings_xml = base_model_path / Path(r"trackmate/basic_settings.xml")
red_segmented_path = base_data_path / 'red_segmented.tiff'
green_segmented_path = base_data_path / 'green_segmented.tiff'
# utils.run_trackmate(trackmate_settings_xml, red_segmented_path)
# utils.run_trackmate(trackmate_settings_xml, green_segmented_path)
Define paths to tracking results and load them into a Pandas DataFrames
In [9]:
Copied!
tm_red = trackmate_utils.TrackmateXML(base_data_path / "red_segmented.tiff.xml")
tm_green = trackmate_utils.TrackmateXML(base_data_path / "green_segmented.tiff.xml")
tm_red = trackmate_utils.TrackmateXML(base_data_path / "red_segmented.tiff.xml")
tm_green = trackmate_utils.TrackmateXML(base_data_path / "green_segmented.tiff.xml")
TrackMate produces two datasets:
- Spots table - includes a unique identifier for each cell and some measurements (X, Y position of center of mass, perimeter, etc). Furthermore, it includes the frame a given cell appeared in and the grayscale value it got assigned during segmentation. Finally, an ROI is provided in the form of a polygon.
- Tracks table - includes a unique identifier for each track and the unique cell identifier of cells belonging to the track
As an example, we can take a look at these tables below:
In [10]:
Copied!
tm_red.spots.head()
tm_red.spots.head()
Out[10]:
frame | POSITION_X | POSITION_Y | PERIMETER | image_id | AREA | ROI | |
---|---|---|---|---|---|---|---|
ID | |||||||
1280 | 0 | 298.457614 | 98.531397 | 68.87987300699037 | 14 | 318.5 | [(2.0423861852433447, 11.968602825745677), (6.... |
1281 | 0 | 249.164397 | 109.666342 | 94.16607520078527 | 15 | 514.0000000000003 | [(11.33560311284046, 11.833657587548643), (13.... |
1282 | 0 | 51.860286 | 116.851993 | 106.62086195196227 | 16 | 723.5 | [(-8.360285648468093, 12.648007371573357), (-6... |
1283 | 0 | 8.230815 | 124.985312 | 98.34159973787956 | 17 | 556.0000000000001 | [(-2.7308153477218227, 20.514688249400493), (-... |
1284 | 0 | 306.240462 | 123.778112 | 70.29699476237073 | 18 | 331.99999999999994 | [(1.259538152610446, 11.72188755020079), (3.25... |
In [11]:
Copied!
tm_red.tracks.head()
tm_red.tracks.head()
Out[11]:
EDGE_TIME | TrackID | SPOT_SOURCE_ID | SPOT_TARGET_ID | EDGE_X_LOCATION | EDGE_Y_LOCATION | |
---|---|---|---|---|---|---|
0 | 6.5 | 0 | 1441 | 252 | 334.9808900546602 | 28.096977698755694 |
1 | 5.5 | 0 | 67 | 1441 | 329.9621126644713 | 38.75997067240739 |
2 | 7.5 | 0 | 252 | 74 | 342.69301090695916 | 21.153634470310546 |
3 | 3.5 | 0 | 669 | 27 | 325.2599715099715 | 64.72873722138428 |
4 | 0.5 | 0 | 1280 | 106 | 303.10427771717116 | 93.1131562142458 |
Assuming we care about all the cells belonging to a specific track, a convenience method exists in the form of:
In [12]:
Copied!
tm_red.trace_track(track_id=0)
tm_red.trace_track(track_id=0)
Out[12]:
ID | frame | POSITION_X | POSITION_Y | PERIMETER | image_id | AREA | ROI | |
---|---|---|---|---|---|---|---|---|
0 | 1280 | 0 | 298.457614 | 98.531397 | 68.87987300699037 | 14 | 318.5 | [(2.0423861852433447, 11.968602825745677), (6.... |
1 | 106 | 1 | 307.750942 | 87.694915 | 80.22959146711749 | 11 | 354.0 | [(4.74905838041434, 12.805084745762713), (5.74... |
2 | 268 | 2 | 316.042723 | 75.078873 | 80.52926568031265 | 10 | 355.0000000000001 | [(2.4572769953051647, 14.421126760563382), (3.... |
3 | 669 | 3 | 323.914279 | 70.212921 | 74.4187648052274 | 9 | 331.5 | [(1.5857214680744391, 14.287078934137767), (3.... |
4 | 27 | 4 | 326.605664 | 59.244553 | 70.75207550444621 | 12 | 306.0 | [(6.894335511982604, 12.255446623093682), (7.8... |
5 | 67 | 5 | 328.896209 | 45.199491 | 81.61131907656338 | 8 | 360.5 | [(5.603791030975515, 14.300508552935739), (6.6... |
6 | 1441 | 6 | 331.028016 | 32.32045 | 86.08285487170572 | 6 | 407.49999999999994 | [(9.471983640081817, 13.179550102249486), (10.... |
7 | 252 | 7 | 338.933764 | 23.873505 | 80.01652756195931 | 5 | 348.5 | [(4.566236250597797, 13.626494500239122), (7.5... |
8 | 74 | 8 | 346.452258 | 18.433763 | 82.65887799040118 | 6 | 387.50000000000017 | [(7.047741935483884, 12.066236559139785), (11.... |
9 | 1315 | 9 | 354.105107 | 9.54788 | 74.48954469058977 | 4 | 365.49999999999994 | [(5.394892840857267, 10.952120383036936), (6.3... |
10 | 1377 | 10 | 356.991179 | 4.355153 | 51.972803760081376 | 5 | 179.50000000000006 | [(3.508820798514421, 7.144846796657381), (4.50... |
Which returns a subset table representing just the cells belonging to a particular track.
In [13]:
Copied!
%load_ext autoreload
%autoreload 2
%load_ext autoreload
%autoreload 2
In [60]:
Copied!
import trackmate_utils
trackmate_utils.view_track([red_stack, green_stack], frame=0, track=tm_red.trace_track(track_id=0))
import trackmate_utils
trackmate_utils.view_track([red_stack, green_stack], frame=0, track=tm_red.trace_track(track_id=0))
Out[60]:
In [64]:
Copied!
import trackmate_utils
trackmate_utils.view_side_by_side([red_stack, green_stack], frame=0, track=tm_red.trace_track(track_id=0))
import trackmate_utils
trackmate_utils.view_side_by_side([red_stack, green_stack], frame=0, track=tm_red.trace_track(track_id=0))
Out[64]:
In [ ]:
Copied!