knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.path = "man/figures/README-", out.width = "100%" )
The goal of CPTrackR is to add unique track ids to CellProfiler tracking output.
NB: No support for LAP tracking with temporal gaps (yet)
You can install the development version of CPTrackR with:
remotes::install_github("burgerga/CPTrackR")
library(tidyverse) library(future) plan(multisession) # Example data is generated from a dataset from Britt (shared by Muriel) # all_data <- read_tsv(file.path("~/../../Downloads","20190925_BrittData_singleCell_1hrDelay_withoutT01.txt")) # data = all_data |> # filter(groupNumber <= 2) |> # select(groupNumber, # groupInd, # Nuclei_TrackObjects_ParentObjectNumber_30, # Nuclei_Number_Object_Number, # Nuclei_Intensity_MeanIntensity_image_green, # starts_with("Nuclei_Location_Center_")) theme_set(theme_classic(base_size = 13))
Show some example uncorrected data extracted from a CellProfiler tsv:
library(CPTrackR) library(tidyverse) data <- read_tsv(system.file("extdata", "cptrackr_example_data.tsv.xz", package="CPTrackR"), show_col_types = F) data %>% select(groupNumber, groupInd, Nuclei_TrackObjects_ParentObjectNumber_30, Nuclei_Number_Object_Number, Nuclei_Intensity_MeanIntensity_image_green)
We can create a lookup table (LUT) for a single group using createLUTGroup
:
library(CPTrackR) lut <- createLUTGroup(data %>% filter(groupNumber == 1), frame_var = groupInd, obj_var = Nuclei_Number_Object_Number, par_obj_var = Nuclei_TrackObjects_ParentObjectNumber_30) lut %>% arrange(Nuclei_Number_Object_Number, groupInd)
Three new columns are added:
cid
: id of the original cell (daughter cells share cid
with parent)uid
: unique id (daughter cells don't share uid
with parent)alt_uid
: character id of cells that show lineage with suffixesFor illustration here the second frame, where we can see alt_uid
s for daughter cells:
lut %>% filter(groupInd == 2) %>% arrange(Nuclei_Number_Object_Number, groupInd)
We can also enable a progress bar (will be visible if you run this code in R):
library(progressr) with_progress({ lut <- createLUTGroup(data %>% filter(groupNumber == 1), frame_var = groupInd, obj_var = Nuclei_Number_Object_Number, par_obj_var = Nuclei_TrackObjects_ParentObjectNumber_30) }) lut %>% arrange(Nuclei_Number_Object_Number, groupInd)
We can create a LUT for multiple groups (=movies) using createLut
, the group_vars
are used to denote the different groups (can be multiple columns):
with_progress({ lut_all <- createLUT(data, group_vars = groupNumber, frame_var = groupInd, obj_var = Nuclei_Number_Object_Number, par_obj_var = Nuclei_TrackObjects_ParentObjectNumber_30) }) lut_all
Now we can join the LUT to the original data
fixed <- data %>% left_join(lut_all) fixed %>% select(groupNumber, groupInd, uid, alt_uid, Nuclei_Intensity_MeanIntensity_image_green)
We can also enable parallelisation using the future
package and specifying a plan
, this will give a considerable speed improvement if you have many movies:
library(future) plan(multisession) with_progress({ lut_all <- createLUT(data, group_vars = groupNumber, frame_var = groupInd, obj_var = Nuclei_Number_Object_Number, par_obj_var = Nuclei_TrackObjects_ParentObjectNumber_30) }) lut_all
lut_all
With our uid
per cell we can now plot the tracks:
ggplot(fixed %>% filter(groupNumber == 1), aes(Nuclei_Location_Center_X, Nuclei_Location_Center_Y, group = uid, color = as.factor(uid))) + geom_path() + guides(color = F) + coord_fixed()
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.