Flow cytometery for Cancer Biologists
Let us first discuss some flow cytometric probes used in exploring the cellular death.
Propidium iodide (PI) is a popular red-fluorescent nuclear and chromosome counterstain.
Since propidium iodide is not permeant to live cells, it is also commonly used to detect dead cells in a population.
PI binds to DNA by intercalating between the bases with little or no sequence preference.
In aqueous solution, the dye has excitation/emission maxima of 493/636 nm.
Once the dye is bound, its fluorescence is enhanced 20- to 30-fold, the fluorescence excitation maximum is shifted ~30–40 nm to the red and the fluorescence emission maximum is shifted ~15 nm to the blue, resulting in an excitation maximum at 535 nm and fluorescence emission maximum at 617 nm.
Fluorescent conjugates of annexin V are commonly used to identify apoptotic cells.
Annexin V staining provides a very sensitive method for detecting cellular apoptosis, while propidium iodide (PI) is used to detect necrotic or late apoptotic cells, characterized by the loss of the integrity of the plasma and nuclear membranes.
Stain | Viable | Apoptotic | LateApoptotic | Necrotic |
---|---|---|---|---|
PI | 0 | 0 | 1 | 1 |
PE | 0 | 1 | 1 | 0 |
library(flowCore)
library(flowClust)
# read files with pattern dct
gh=read.flowSet(files=NULL, path="./isha/5thJan20",pattern="hct")
fnames.h=gh@phenoData@data$name
gc=read.flowSet(files=NULL, path="./isha/5thJan20",invert.pattern="hct")
fnames.c=gc@phenoData@data$name
i=4
f=fnames.h[i]
f= paste0('./isha/5thJan20/',sep='',f)
ff=read.FCS(f)
df=data.frame(ff@exprs[,1:6])
attach(df)
a=df$FSC.A
h=df$FSC.H
ik=doublet(a,h)
A=a[ik]
H=h[ik]
plot(a,h,pch=16,cex=0.5)
points(A,H,pch=16,cex=0.5,col="red")
library(flowClust)
# defining a singlet dataframe
df.singlet=data.frame(sFSC.A=FSC.A[ik],sFSC.H=FSC.H[ik],sSSC.A=SSC.A[ik],sSSC.H=SSC.H[ik],sPE.A=PE.A[ik],sPI.A=PI.A[ik])
#plot(FSC.H,SSC.H,pch=16,cex=0.5)
res1 <- flowClust(df.singlet,
varNames=c("sFSC.H", "sSSC.H"), K=1)
df2=Subset(df.singlet,res1)
res2<-flowClust(df2, varNames=c("sFSC.H", "sSSC.H"), K=1:3, B=100)
criterion(res2,"BIC")
[1] -129001.3 -123283.7 -122903.8
plot(res2[[3]], data=df2, level=0.8, z.cutoff=0)
Rule of identifying outliers: 80% quantile
attach(df.singlet)
iik=which(sFSC.H<100 & sSSC.H<1560)
plot(sFSC.H,sSSC.H,pch=16,col="brown",cex=0.5)
points(sFSC.H[iik],sSSC.H[iik],pch=16,col="blue",cex=0.5)
df.singlet.nodebris =
data.frame(mFSC.A=sFSC.A[-iik],mFSC.H=sFSC.H[-iik],mSSC.A=sSSC.A[-iik],mSSC.H=sSSC.H[-iik],mPE.A=sPE.A[-iik],mPI.A=sPI.A[-iik])
plot(df.singlet.nodebris$mFSC.H,df.singlet.nodebris$mSSC.H,pch=16,cex=0.5)
attach(df.singlet)
plot(sFSC.H,sSSC.H,pch=16,cex=0.5)
points(sFSC.H[ik3],sSSC.H[ik3],pch=16,cex=0.5,col="blue")
s1=split(df.singlet, res2)[[1]]
s2=split(df.singlet, res2)[[2]]
s3=split(df.singlet, res2)[[3]]
#plot(s1$sFSC.H,s1$sSSC.H,pch=19,col="red",cex=0.1)
plot(s3$sFSC.H,s3$sSSC.H,pch=19,col="green",cex=0.1)
#points(s3$sFSC.H,s3$sSSC.H,pch=19,col="blue",cex=0.1)
We now have a dataframe with the “iik” s which has actually gated out the singlet as well as the debris population.
mres1 <- flowClust(df.singlet.nodebris,
varNames=c("mPE.A", "mPI.A"), K=1)
df2m=Subset(df.singlet.nodebris,mres1)
mres2<-flowClust(df2m, varNames=c("mPE.A", "mPI.A"), K=1:2, B=1000)
criterion(mres2,"BIC")
[1] -28032.00 -27490.53
plot(mres2[[2]], data=df2m, level=0.8, z.cutoff=0)
Rule of identifying outliers: 80% quantile