#' @title GlowwormSubpopulation Categorizes genes
#' @description This function takes the output from GlowwormScale or GlowwormIntegrate and generates a
#' scatter plot and corresponding ranked data frame for each gene based on expression and specificity. Need to provide a value for rank OR at least one of TargetDataset, TargetClass, TargetSubclass. If more than one of TargetDataset, TargetClass or TargetSubclass are included only the matched populations will be prioritized.
#' @param Input Output from GlowwormScale or GlowwormIntegrate
#' @param TargetClass A vector of cell class/s which you wish to perform gene prioritization.
#' @param TargetSublass A vector of cell subclass/s which you wish to perform gene prioritization.
#' @param TargetDataset A vector of dataset/s which you wish to perform gene prioritization.
#' @param Rank A integer indicating the population based on the cell population ranking.
#' @return This function generates object containing a scatter plot and a data frame containing the underlying gene categorization.
#' @export
GlowwormSubpopulation = function(Input, TargetSubclass = NULL, TargetClass = NULL, TargetDataset = NULL, Rank = NULL){
OutputList = list()
scData = Input@GlowwormScaleOutput
scDataBin = as.data.frame(ifelse(scData > 0, 1, 0))
scData$Class = gsub(".*\\|", "", gsub("\\^.*", "", row.names(scData)))
scData$Subclass = gsub("\\|.*", "", row.names(scData))
scData$Dataset = gsub(".*\\^", "", row.names(scData))
scDataBin$Class = gsub(".*\\|", "", gsub("\\^.*", "", row.names(scDataBin)))
scDataBin$Subclass = gsub("\\|.*", "", row.names(scDataBin))
scDataBin$Dataset = gsub(".*\\^", "", row.names(scDataBin))
if(class(Rank) == "numeric"){
if(is.null(TargetSubclass) & is.null(TargetClass) & is.null(TargetDataset)){
GetRankScores = subset(Input@RankScores, Significant == "Enriched")
GetRankScores = data.frame(GetRankScores[order(-GetRankScores$Percent_DeltaSub),])
scDataKeyTarget = subset(scData,scData$Subclass %in% GetRankScores$Subclass[Rank] & scData$Class %in% GetRankScores$Class[Rank] & scData$Dataset %in% GetRankScores$Dataset[Rank])
scDataKeyTargetBin = subset(scDataBin, scDataBin$Subclass %in% GetRankScores$Subclass[Rank] & scDataBin$Class %in% GetRankScores$Class[Rank] & scDataBin$Dataset %in% GetRankScores$Dataset[Rank])
}else{stop("Need to provide either a numeric rank, OR a string for at least one of TargetClass, TargetSubclass or Dataset")}
}
#Identify target from inputs and provide appropriate warnings
#If all are NULL:
if(is.null(TargetSubclass) & is.null(TargetClass) & is.null(TargetDataset) & is.null(Rank)){stop("Need to provide either a numeric rank, or a string for at least one of TargetClass, TargetSubclass or Dataset")
#If only dataset provided:
}else if(class(TargetDataset) == "character" & is.null(TargetClass) & is.null(TargetSubclass)){
TargetDInMeta = subset(Input@MetaData, Dataset %in% TargetDataset)
if(dim(TargetDInMeta)[1] == 0){stop("TargetDataset must be a valid daraset from the input metadata")}else{
scDataKeyTarget = subset(scData, scData$Dataset %in% unique(TargetDInMeta$Dataset))
scDataKeyTargetBin = subset(scDataBin, scDataBin$Dataset %in% unique(TargetDInMeta$Dataset))}
if(length(unique(TargetDInMeta$Class))>1){warning(paste(TargetDataset, "contains", length(unique(TargetDInMeta$Class)), "classes. Specify `TargetClass` if only interested in a subset of these classes.", sep=" "))}
if(length(unique(TargetDInMeta$Subclass))>1){warning(ppaste(TargetDataset, "contains", length(unique(TargetDInMeta$Subclass)), "classes. Specify `TargetSubclass` if only interested in a subset of these subclasses.", sep=" "))}
#If only class provided:
}else if(class(TargetClass) == "character" & is.null(TargetSubclass) & is.null(TargetDataset)){
TargetCInMeta = subset(Input@MetaData, Class %in% TargetClass)
if(dim(TargetCInMeta)[1] == 0){stop("TargetClass must be a valid class from the input metadata")}else{
scDataKeyTarget = subset(scData, scData$Class %in% unique(TargetCInMeta$Class))
scDataKeyTargetBin = subset(scDataBin, scDataBin$Class %in% unique(TargetCInMeta$Class))}
if(length(unique(TargetCInMeta$Dataset)) >1){warning(paste(TargetClass, "is present for", length(unique(TargetCInMeta$Dataset)),"datasets. Specify `TargetDataset` if only interested in a subset of these datasets.", sep=" "))}
#If only subclass provided:
}else if(class(TargetSubclass) == "character" & is.null(TargetClass) & is.null(TargetDataset)){
TargetSCInMeta = subset(Input@MetaData, Subclass %in% TargetSubclass)
if(dim(TargetSCInMeta)[1] == 0){stop("TargetSubclass must be a valid subclass from the input metadata")}else{
scDataKeyTarget = subset(scData, scData$Subclass %in% unique(TargetSCInMeta$Subclass))
scDataKeyTargetBin = subset(scDataBin, scDataBin$Subclass %in% unique(TargetSCInMeta$Subclass))}
if(length(unique(TargetSCInMeta$Dataset))>1){warning(paste(TargetSubclass, "is present for", length(unique(TargetSCInMeta$Dataset)), "classes. Specify `TargetClass` if only interested in a subset of these classes.", sep=" "))}
if(length(unique(TargetSCInMeta$Dataset))>1){warning(paste(TargetSubclass, " is present for", length(unique(TargetSCInMeta$Dataset)), "datasets. Specify `TargetDataset` if only interested in a subset of these datasets.", sep=" "))}
#If both class and subclass provided but not dataset
}else if(class(TargetSubclass) == "character" & class(TargetSubclass) == "character" & is.null(TargetDataset)){
TargetSCInMeta = subset(Input@MetaData, Subclass %in% TargetSubclass & Class %in% TargetClass)
TargetSCMissing = subset(TargetSubclass, ! TargetSubclass %in% TargetSCInMeta$Subclass)
TargetCMissing = subset(TargetClass, ! TargetClass %in% TargetSCInMeta$Class)
if(length(unique(TargetSCInMeta$Dataset)) >1){warning(paste(TargetSubclass, "/", TargetClass, " is present for", length(unique(TargetSCInMeta$Dataset)), "datasets. Specify `TargetDataset` if only interested in a subset of these datasets.", sep=""))}
if(length(TargetCMissing) > 0 & dim(TargetSCInMeta)[1] > 0){warning(paste("Matched pair(s) found for: ", paste(unique(paste(TargetSCInMeta$Class, "|", TargetSCInMeta$Subclass)), collapse = "; ")), ". \nNo matched pair(s) found for Class: ", TargetCMissing)}
if(length(TargetSCMissing) > 0 & dim(TargetSCInMeta)[1] > 0){warning(paste("Matched pair(s) found for: ", paste(unique(paste(TargetSCInMeta$Class, "|", TargetSCInMeta$Subclass)), collapse = "; ")), ". \nNo matched pair(s) found for subclass: ", TargetSCMissing)}
if(dim(TargetSCInMeta)[1] == 0){stop("If specifiying both TargetSubclass and TargetClass, these need to be paired populations within the metadata (ie Class = T cells and Subclass = CD4+ T cells)")}else{
scDataKeyTarget = subset(scData, scData$Subclass %in% unique(TargetSCInMeta$Subclass) & scData$Class %in% unique(TargetSCInMeta$Class))
scDataKeyTargetBin = subset(scDataBin, scDataBin$Subclass %in% unique(TargetSCInMeta$Subclass) & scDataBin$Class %in% unique(TargetSCInMeta$Class))
}
#If both class and dataset provided but not subclass
}else if(class(TargetClass) == "character" & class(TargetDataset) == "character" & is.null(TargetSubclass)){
TargetCDInMeta = subset(Input@MetaData, Class %in% TargetClass & Dataset %in% TargetDataset)
TargetDMissing = subset(TargetDataset, ! TargetDataset %in% TargetCDInMeta$Dataset)
TargetCMissing = subset(TargetClass, ! TargetClass %in% TargetCDInMeta$Class)
if(length(unique(TargetCDInMeta$Subclass)) >1){warning(paste(TargetClass, "/", TargetDataset, "contains", length(unique(TargetCDInMeta$Subclass)), "subclasses. Specify `TargetSubclass` if only interested in a subset of these subclasses", sep=" "))}
if(length(TargetCMissing) > 0 & dim(TargetCDInMeta)[1] > 0){warning(paste("Matched pair(s) found for: ", paste(unique(paste(TargetCDInMeta$Class, "|", TargetCDInMeta$Dataset)), collapse = "; ")), ". \nNo matched pair(s) found for Class: ", TargetCMissing)}
if(length(TargetDMissing) > 0 & dim(TargetCDInMeta)[1] > 0){warning(paste("Matched pair(s) found for: ", paste(unique(paste(TargetCDInMeta$Class, "|", TargetCDInMeta$Dataset)), collapse = "; ")), ". \nNo matched pair(s) found for Dataset: ", TargetDMissing)}
if(dim(TargetCDInMeta)[1] == 0){stop("If specifiying both TargetDataset and TargetClass, these need to be paired populations within the metadata (ie Dataset = Blood and Class = T cells)")}else{
scDataKeyTarget = subset(scData, scData$Class %in% unique(TargetCDInMeta$Class) & scData$Dataset %in% unique(TargetCDInMeta$Dataset))
scDataKeyTargetBin = subset(scDataBin, scDataBin$Class %in% unique(TargetCDInMeta$Class) & scDataBin$Dataset %in% unique(TargetCDInMeta$Dataset)) }
#If both subclass and dataset provided but not Class
}else if(class(TargetSubclass) == "character" & class(TargetDataset) == "character" & is.null(TargetClass)){
TargetCSCInMeta = subset(Input@MetaData, Subclass %in% TargetSubclass & Dataset %in% TargetDataset)
TargetDMissing = subset(TargetDataset, ! TargetDataset %in% TargetCSCInMeta$Dataset)
TargetSCMissing = subset(TargetSubclass, ! TargetSublass %in% TargetCSCInMeta$Subclass)
if(length(unique(TargetCSCInMeta$Subclass)) >1){warning(paste(TargetSubclass, "/", TargetDataset, "contains", length(unique(TargetCSCInMeta$Class)), "Classes. Specify `TargetClass` if only interested in a subset of these Classes", sep=" "))}
if(length(TargetSCMissing) > 0 & dim(TargetCSCInMeta)[1] > 0){warning(paste("Matched pair(s) found for: ", paste(unique(paste(TargetCSCInMeta$Subclass, "|", TargetCSCInMeta$Dataset)), collapse = "; ")), ". \nNo matched pair(s) found for Subclass: ", TargetSCMissing)}
if(length(TargetDMissing) > 0 & dim(TargetCSCInMeta)[1] > 0){warning(paste("Matched pair(s) found for: ", paste(unique(paste(TargetCSCInMeta$Subclass, "|", TargetCSCInMeta$Dataset)), collapse = "; ")), ". \nNo matched pair(s) found for Dataset: ", TargetDMissing)}
if(dim(TargetCSCInMeta)[1] == 0){stop("If specifiying both TargetDataset and TargetSubclass, these need to be paired populations within the metadata (ie Dataset = Blood and Subclass = CD4+ T cells)")}else{
scDataKeyTarget = subset(scData,scData$Subclass %in% unique(TargetCSCInMeta$Sublass) & scData$Dataset %in% unique(TargetCSCInMeta$Dataset))
scDataKeyTargetBin = subset(scDataBin, scDataBin$Subclass %in% unique(TargetCSCInMeta$Sublass) & scDataBin$Dataset %in% unique(TargetCSCInMeta$Dataset))}
#If all are specified
}else if(class(TargetSubclass) == "character" & class(TargetDataset) == "character" & class(TargetClass) == "character"){
TargetDCSCInMeta = subset(Input@MetaData, Subclass %in% TargetSubclass & Dataset %in% TargetDataset & Class %in% TargetClass)
TargetDMissing = subset(TargetDataset, ! TargetDataset %in% TargetDCSCInMeta$Dataset)
TargetCMissing = subset(TargetClass, ! TargetClass %in% TargetDCSCInMeta$Class)
TargetSCMissing = subset(TargetSubclass, ! TargetSublass %in% TargetDCSCInMeta$Subclass)
if(dim(TargetDCSCInMeta)[1] > 0 & length(TargetSCMissing) > 0 & length(TargetDMissing) == 0 & length(TargetCMissing) == 0){warning(paste("Matched pair(s) found for: ", paste(unique(paste(TargetCSCInMeta$Subclass))), "|", paste(unique(paste(TargetCSCInMeta$Class))), "|", paste(unique(paste(TargetDCSCInMeta$Dataset)), collapse = "; ")), ". \nNo matched pair(s) found for Subclass: ", TargetSCMissing)}
if(dim(TargetDCSCInMeta)[1] > 0 & length(TargetCMissing) > 0 & length(TargetDMissing) == 0 & length(TargetSCMissing) == 0){warning(paste("Matched pair(s) found for: ", paste(unique(paste(TargetCSCInMeta$Subclass))), "|", paste(unique(paste(TargetCSCInMeta$Class))), "|", paste(unique(paste(TargetDCSCInMeta$Dataset)), collapse = "; ")), ". \nNo matched pair(s) found for Class: ", TargetCMissing)}
if(dim(TargetDCSCInMeta)[1] > 0 & length(TargetDMissing) > 0 & length(TargetCMissing) == 0 & length(TargetSCMissing) == 0){warning(paste("Matched pair(s) found for: ", paste(unique(paste(TargetCSCInMeta$Subclass))), "|", paste(unique(paste(TargetCSCInMeta$Class))), "|", paste(unique(paste(TargetDCSCInMeta$Dataset)), collapse = "; ")), ". \nNo matched pair(s) found for Dataset: ", TargetDMissing)}
if(dim(TargetDCSCInMeta)[1] > 0 & length(TargetSCMissing) > 0 & length(TargetDMissing) == 0 & length(TargetCMissing) > 0){warning(paste("Matched pair(s) found for: ", paste(unique(paste(TargetCSCInMeta$Subclass))), "|", paste(unique(paste(TargetCSCInMeta$Class))), "|", paste(unique(paste(TargetDCSCInMeta$Dataset)), collapse = "; ")), ". \nNo matched pair(s) found for Subclass: ", TargetSCMissing, "and Class:", TargetCMissing)}
if(dim(TargetDCSCInMeta)[1] > 0 & length(TargetSCMissing) > 0 & length(TargetDMissing) > 0 & length(TargetCMissing) == 0){warning(paste("Matched pair(s) found for: ", paste(unique(paste(TargetCSCInMeta$Subclass))), "|", paste(unique(paste(TargetCSCInMeta$Class))), "|", paste(unique(paste(TargetDCSCInMeta$Dataset)), collapse = "; ")), ". \nNo matched pair(s) found for Subclass: ", TargetSCMissing, "and Dataset:", TargetDMissing)}
if(dim(TargetDCSCInMeta)[1] > 0 & length(TargetSCMissing) == 0 & length(TargetDMissing) > 0 & length(TargetCMissing) > 0){warning(paste("Matched pair(s) found for: ", paste(unique(paste(TargetCSCInMeta$Subclass))), "|", paste(unique(paste(TargetCSCInMeta$Class))), "|", paste(unique(paste(TargetDCSCInMeta$Dataset)), collapse = "; ")), ". \nNo matched pair(s) found for Class: ", TargetCMissing, "and Dataset:", TargetDMissing)}
if(dim(TargetDCSCInMeta)[1] == 0){stop("If specifiying all of TargetDataset, TargetClass and TargetSubclass, these need to be paired populations within the metadata (ie Dataset = Blood, Class = T cells and Subclass = CD4+ T cells)")}else{
scDataKeyTarget = subset(scData,scData$Subclass %in% unique(TargetDCSCInMeta$Sublass) & scData$Class %in% unique(TargetDCSCInMeta$Class) & scData$Dataset %in% unique(TargetDCSCInMeta$Dataset))
scDataKeyTargetBin = subset(scDataBin, scDataBin$Subclass %in% unique(TargetDCSCInMeta$Sublass) & scDataBin$Class %in% unique(TargetDCSCInMeta$Class) & scDataBin$Dataset %in% unique(TargetDCSCInMeta$Dataset))}
}
#Expression in target population
scDataKeyTarget <- scDataKeyTarget[!names(scDataKeyTarget) %in% c("Dataset", "Class", "Subclass")]
ExpData = as.data.frame(colSums(scDataKeyTarget))
colnames(ExpData) = "Expression"
#Specificity in target population
scDataKeyTargetBin <- scDataKeyTargetBin[!names(scDataKeyTargetBin) %in% c("Dataset", "Class", "Subclass")]
TargetSpec = as.data.frame(colSums(scDataKeyTargetBin))
colnames(TargetSpec) = "TargetFreq"
#Expression in all populations
scDataBin <- scDataBin[!names(scDataBin) %in% c("Dataset", "Class", "Subclass")]
AllSpec = as.data.frame(colSums(scDataBin))
colnames(AllSpec) = "TotalFreq"
SpecData = merge(TargetSpec, AllSpec, by = 0)
SpecData$Specificity = SpecData$TargetFreq/SpecData$TotalFreq
SpecData[SpecData == "NaN"] = 0
#Compile
ExpSpecData = merge(ExpData, SpecData, by.x = 0, by.y = "Row.names")
#Compile Data
ExpSpecTarget = subset(ExpSpecData, ExpSpecData$Row.names %in% Input@Settings$TargetGenes)
ExpSpecSecondary = subset(ExpSpecData, ExpSpecData$Row.names %in% Input@Settings$SecondaryGenes)
#Group data
ExpSpecTarget$Group = ifelse(ExpSpecTarget$Expression > mean(ExpSpecSecondary$Expression)+sd(ExpSpecSecondary$Expression) &
ExpSpecTarget$Specificity > mean(ExpSpecSecondary$Specificity)+sd(ExpSpecSecondary$Specificity),
"HighExp/HighSpec", NA)
ExpSpecTarget$Group = ifelse(ExpSpecTarget$Expression > mean(ExpSpecSecondary$Expression)+sd(ExpSpecSecondary$Expression) &
ExpSpecTarget$Specificity <= mean(ExpSpecSecondary$Specificity)+sd(ExpSpecSecondary$Specificity),
"HighExp/LowSpec", ExpSpecTarget$Group)
ExpSpecTarget$Group = ifelse(ExpSpecTarget$Expression <= mean(ExpSpecSecondary$Expression)+sd(ExpSpecSecondary$Expression) &
ExpSpecTarget$Specificity > mean(ExpSpecSecondary$Specificity)+sd(ExpSpecSecondary$Specificity),
"LowExp/HighSpec", ExpSpecTarget$Group)
ExpSpecTarget$Group = ifelse(ExpSpecTarget$Expression <= mean(ExpSpecSecondary$Expression)+sd(ExpSpecSecondary$Expression) &
ExpSpecTarget$Specificity <= mean(ExpSpecSecondary$Specificity)+sd(ExpSpecSecondary$Specificity),
"LowExp/LowSpec", ExpSpecTarget$Group)
ExpSpecTarget$Group = ifelse(ExpSpecTarget$Expression == 0, "Not expressed", ExpSpecTarget$Group)
ExpSpecToPlot = subset(ExpSpecTarget, ! Group %in% "Not expressed")
#Plot data
PopPlot = ggplot(ExpSpecToPlot, aes(x = Expression, y=Specificity, label = Row.names, color = Group)) + geom_point() + theme_light() + geom_label_repel(size = 2)+ ylab("Specificity") + xlab("Expression") + geom_hline(yintercept=(mean(ExpSpecSecondary$Specificity)+sd(ExpSpecSecondary$Specificity)), linetype="dashed") + geom_vline(xintercept=(mean(ExpSpecSecondary$Expression)+sd(ExpSpecSecondary$Expression)), linetype="dashed") + scale_color_manual(values=c("HighExp/HighSpec" = "#F8766D", "HighExp/LowSpec" = "#7CAE00", "LowExp/HighSpec" = "#00BFC4","LowExp/LowSpec" = "#C77CFF", "Not expressed" = "#D3D3D3")) + theme(legend.title = element_blank())
#Print results
output = c(paste("From the ", length(Input@Settings$TargetGenes), " input genes, ", dim(ExpSpecTarget)[1]-length(which(ExpSpecTarget$Group == "Not expressed")), " genes were expressed in the target population(s). \n", length(which(ExpSpecTarget$Group == "HighExp/HighSpec")), " were high expression/high specificity.\n", length(which(ExpSpecTarget$Group == "HighExp/LowSpec")), " were high expression/low specificity.\n", length(which(ExpSpecTarget$Group == "LowExp/HighSpec")), " were low expression/high specificity.\n", length(which(ExpSpecTarget$Group == "LowExp/LowSpec")), " were low expression/low specificity.\n", sep=""))
#cat(output)
## OG DO NOT DELETE ##
setOldClass(c("gg", "ggplot"))
#setClass("GlowwormObjPop", representation(Plot = "ggplot", Data = "data.frame"))
#PopOutput = new("GlowwormObjPop", Plot = PopPlot, Data = ExpSpecTarget)
## END OG ##
setClass("GlowwormObjPop", slots= c(Plot = "ggplot", Data = "data.frame"))
PopOutput = new("GlowwormObjPop", Plot = PopPlot, Data = ExpSpecTarget)
#if(is.null(TargetSC)){OutputMsg = paste(" for Class:", TargetC)
#}else if(is.null(TargetC)){OutputMsg = paste(" for Subclass:", TargetSC)
#}else{OutputMsg == paste(" for Subclass:", TargetSC, " from Class:", TargetC)}
setMethod("show",signature = signature(object = "GlowwormObjPop"),
function(object){
print_message <- paste0(c("Object of class GlowwormObjPop\nPrioritized genes from Input:", Input@Settings$InputFile, "\n", output))
cat(print_message,sep = "")
})
return(PopOutput)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.