DEXSeqHTML <- function(object, genes=NULL, path="DEXSeqReport", file="testForDEU.html", fitExpToVar="condition", FDR=0.1, color=NULL, color.samples=NULL, mart="", filter="", attributes="", extraCols=NULL, BPPARAM=MulticoreParam(workers=1) )
{
stopifnot( is( object, "DEXSeqResults" ) )
if(!fitExpToVar %in% colnames( object@modelFrameBM )){
stop(sprintf("The value of the parameter fitExpToVar, '%s', is not a variable from the annotation of the samples. Please specify a column name of the colData slot of the DEXSeqDataSet object.", fitExpToVar))
}
######## GET THE RESULT TABLE READY ##########
genomicData <- as.data.frame( object$genomicData )
results <- data.frame( object[, c( "groupID", "featureID", "exonBaseMean", "dispersion", "pvalue", "padj" )], stringsAsFactors=TRUE)
results <- cbind( results, genomicData )
dexseqR <- mcols( object )$type == "DEXSeq results"
if(sum(dexseqR, na.rm=TRUE) > 0){
results <-
cbind(
results,
round(
as.data.frame( object[,which(dexseqR)] ), 3
)
)
}
rownames(results) <- NULL
sampleData <- object@sampleData
numcond <- length(unique(sampleData[[fitExpToVar]]))
if(is.null(color)){
color<-rgb(colorRamp(c("#D7191C", "#FFFFBF", "#2B83BA"))(seq(0, 1, length.out=numcond)), maxColorValue=255, alpha=175)
}
names(color) <- sort(levels(sampleData[[fitExpToVar]]))
dir.create(file.path(path, "files"), recursive=TRUE)
if(is.null(genes)){
gns <- as.character(unique(results$groupID[which(results$padj < FDR)]))
}else{
gns <- genes
}
if(!all(gns %in% object$groupID)){
stop("The geneIDs provided are not in the ecs object")}
if(length(gns)==0){
stop("There are no significant results in the test... nothing to report")}
p<-openPage(file.path(path, file))
hwrite('DEXSeq differential exon usage test', p, heading=1)
hwrite('Experimental design', p, heading=2)
cond<-as.matrix( as.data.frame( sampleData[,!colnames(sampleData) %in% "sizeFactor"] ) )
rownames(cond) <- NULL
condcolor <- matrix(rep("white", nrow(cond)*ncol(cond)), nrow(cond))
condcolor[,which(colnames(cond) %in% fitExpToVar)] <- color[as.character(sampleData[[fitExpToVar]])]
if(!is.null(color.samples)){
condcolor[,1] <- color.samples}
hwrite(cond, bgcolor=condcolor, p)
formulas <- mcols(object)[colnames(object) == "pvalue","description"]
formulas <- sapply( strsplit(formulas, "vs|p-value:" ), "[", c(2, 3))
formulas <- as.vector( gsub("'", "", formulas) )
hwrite(paste("\n\nformulaDispersion = ", formulas[1], sep=""), p, heading=3)
hwrite(paste("\nformula0 = ", formulas[2], sep=""), p, heading=3)
hwrite(paste("\nformula1 = ", formulas[1], sep=""), p, heading=3)
hwrite('testForDEU result table', p, heading=2)
ptowrite <- paste0(path, "/files/")
######### prepare colors for table results
m2col <- colorRampPalette(c("#FF706B", "#FEE08B", "white"), space="rgb")(5)
matcol <- matrix(rep(m2col[5], ncol(results)*nrow(results)), nrow(results))
######### COLOR LEGEND = I BET THERE IS A SMARTER WAY OF DOING THIS:
j <- 4
for(i in c(0.25, 0.1, 0.05, 0.01)){
matcol[which(results$padj <= i),] <- m2col[j]
j <- j-1
}
legend <- hwrite(c("<= 0.01", "<= 0.05", "<= 0.1", "<= 0.25", "> 0.25"), bgcolor=m2col)
makePagesForGene <- function(gene){
# print( gene )
back <- hwrite("back", link=file.path("..", file))
nameforlinks <- sapply(strsplit(gene, "\\+"), "[[", 1)
otherlinks <- hwrite(c("counts", "expression", "splicing", "transcripts", "results"), link=c(paste(nameforlinks, "counts.html", sep=""), paste(nameforlinks, "expression.html", sep=""), paste(nameforlinks, "splicing.html", sep=""), paste(nameforlinks, "transcripts.html", sep=""), paste(nameforlinks, "results.html", sep="")), table=FALSE)
loc <- as.character(results$groupID) %in% as.character(gene)
### this makes the page where to explore the pvalues ###
subres <- results[loc,]
subres[c("dispersion", "pvalue", "padj")] <- round(subres[c("dispersion", "pvalue", "padj")], 3)
submatcol <- matcol[loc,]
rownames(subres) <- NULL
genpage <- openPage(paste(ptowrite, nameforlinks, "results.html", sep=""))
hwrite(c(back, otherlinks), table=TRUE, border=0, genpage)
hwrite(legend, page=genpage)
hwrite(as.matrix(subres), bgcolor=submatcol, table.class="sortable", style='margin:16px; border:0px solid black; border-width:0px; width:200px', table=TRUE, page=genpage)
close(genpage, splash=TRUE)
### MAKE THE PLOT HTML PAGES FOR expression, counts and splicing
makePlotPage( object, ptowrite=ptowrite, gene=gene, whichtag="expression", links=c(back, otherlinks), color=color, color.samples=color.samples, FDR=FDR, fitExpToVar=fitExpToVar, width=1200, height=700, h=7)
makePlotPage( object, ptowrite=ptowrite, gene=gene, whichtag="counts", links=c(back, otherlinks), color=color, color.samples=color.samples, FDR=FDR, fitExpToVar=fitExpToVar, width=1200, height=700, h=7)
makePlotPage( object, ptowrite=ptowrite, gene=gene, whichtag="splicing", links=c(back, otherlinks), color=color, color.samples=color.samples, FDR=FDR, fitExpToVar=fitExpToVar, width=1200, height=700, h=7)
transcripts <- object$transcripts[loc]
if(length( unlist( transcripts ) ) > 0 ) {
trans <- Reduce(union, transcripts)
h <- ifelse(length(trans) > 10, 7+(length(trans)*0.3), 7)
if(sum(loc) > 30){ ############# if there are more than 30 exons, increase the size of the plotting region
h <- h + (sum(loc)*0.1)
}
makePlotPage( object, ptowrite=ptowrite, gene=gene, whichtag=c("expression", "transcripts"), links=c(back, otherlinks), color=color, color.samples=color.samples, FDR=FDR, fitExpToVar=fitExpToVar, width=1200, height=h*100, h=h)
}
return()
}
bplapply( gns, makePagesForGene, BPPARAM=BPPARAM )
results <- results[as.character(results$groupID) %in% gns,]
splitCols <- split( seq_len(nrow( results ) ), results$groupID )
genetable <- lapply( splitCols, function(x){
data.frame(
chr=unique( results$seqnames[x] ),
start=min( results$start[x] ),
end=max( results$end[x] ),
total_exons = length(x),
exon_changes = sum( results$padj[x] < FDR, na.rm=TRUE) )
})
genetable <- do.call(rbind, genetable)
genetable <- cbind( geneID=rownames(genetable), genetable )
if(class(mart) == "Mart"){
if(attributes(mart)$dataset != ""){
forvalues <- strsplit(as.character(genetable$geneID), "\\+")
names(forvalues) <- genetable$geneID
if(length(filter) > 1){
warning("length(filter) > 2, only first element will be taken")
filter <- filter[1]
}
extra <- getBM(attributes=c(filter, attributes), filters=filter, values=unlist(forvalues), mart=mart)
fromart <- lapply(genetable$geneID, function(x){
sep <- do.call(c, strsplit(as.character(x), "\\+"))
extra[which(extra[,filter] %in% sep),]
})
extra <- sapply(attributes,
function(r){
unlist(
lapply(fromart,
function(x){
paste(x[,r], collapse=" ")
}
)
)
}
)
genetable <- cbind(geneID=genetable$geneID, extra, genetable[,2:length(genetable)])
}else{
warning("No dataset in biomart specified")
}
}else if( mart != ""){
warning("Please provide a Mart class object for parameter mart")
}
if( !is.null( extraCols )){
genetable <- cbind(extraCols[match(genetable$geneID, rownames(extraCols)),], genetable)
}
genetable$geneID <- sapply(as.character(genetable$geneID), function(m){w <- strsplit(m, "\\+");ns <- sapply(w, "[[", 1);hwrite(paste(unlist(w), collapse=" "), link=paste("files/", ns, "expression.html", sep=""))})
rownames(genetable) <- NULL
hwrite(genetable, page=p, table=TRUE, table.class="table-layout:fixed", style='margin:16px; border:0px solid black; border-width:1px; width:20%')
close(p, splash=TRUE)
}
makePlotPage <- function(object, ptowrite, gene, whichtag, links, color, color.samples, FDR, fitExpToVar, width, height, h){
allopts <- c("expression", "splicing", "counts", "transcripts")
opts <- allopts %in% whichtag
onlytag <- allopts[max(which(opts))]
pagename <- sapply(strsplit(as.character(gene), "\\+"), "[[", 1)
genpage <- openPage(paste(ptowrite, pagename, onlytag, ".html", sep=""))
hwrite(links, table=TRUE, border=0, genpage)
svg(paste(ptowrite, pagename, onlytag, ".svg", sep=""), height=h, width=12, pointsize=14)
plotDEXSeq(object, geneID=gene, FDR=FDR, lwd=2, expression=opts[1], splicing=opts[2], norCounts=opts[3], displayTranscripts=opts[4], fitExpToVar=fitExpToVar, legend=TRUE, color=color, color.samples=color.samples, cex.axis=1.5)
dev.off()
hwrite(hmakeTag("iframe", src=paste(pagename, onlytag, ".svg", sep=""), width=width, height=height, border=0), page=genpage )
close(genpage, splash=TRUE)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.