knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  fig.path = "man/figures/README-",
  out.width = "100%"
)

CPTrackR

DOI R-CMD-check

The goal of CPTrackR is to add unique track ids to CellProfiler tracking output.

NB: No support for LAP tracking with temporal gaps (yet)

Installation

You can install the development version of CPTrackR with:

remotes::install_github("burgerga/CPTrackR")

Usage

Creating a lookup table (LUT)

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:

For illustration here the second frame, where we can see alt_uids 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)

Parallelisation

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

Plotting

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()


burgerga/CPTrackR documentation built on Jan. 29, 2024, 1:24 p.m.