```#' Cumulative sum scaling percentile selection
#'
#' Calculates the percentile for which to sum counts up to and scale by. Faster
#' version than available in cumNormStat. Deviates from methods described in Nature Methods by
#' making use of ro means for reference.
#'
#' @param obj A matrix or MRexperiment object.
#' @param pFlag Plot the median difference quantiles.
#' @param rel Cutoff for the relative difference from one median difference
#' from the reference to the next.
#' @param ... Applicable if pFlag == TRUE. Additional plotting parameters.
#' @return Percentile for which to scale data
#' @examples
#'
#' data(mouseData)
#' p = round(cumNormStatFast(mouseData,pFlag=FALSE),digits=2)
#'
cumNormStatFast <-function(obj,pFlag = FALSE,rel=.1,...){
mat = returnAppropriateObj(obj,FALSE,FALSE)
smat = lapply(1:ncol(mat), function(i) {
sort(mat[which(mat[, i]>0),i], decreasing = TRUE)
})
leng = max(sapply(smat,length))
if(any(sapply(smat,length)==1)) stop("Warning sample with one or zero features")

smat2 = array(NA,dim=c(leng,ncol(mat)))
for(i in 1:ncol(mat)){
smat2[leng:(leng-length(smat[[i]])+1),i] = smat[[i]]
}

rmat2 = sapply(1:ncol(smat2),function(i){
quantile(smat2[,i],p=seq(0,1,length.out=nrow(smat2)),na.rm=TRUE)
})
smat2[is.na(smat2)] = 0
ref1 = rowMeans(smat2)

ncols = ncol(rmat2)
diffr = sapply(1:ncols, function(i) {
ref1 - rmat2[,i]
})
diffr1=matrixStats::rowMedians(abs(diffr))
if(pFlag==TRUE){
plot(abs(diff(diffr1))/diffr1[-1],type="h",...)
abline(h=rel)
axis(1,at=seq(0,length(diffr1),length.out=5),labels = seq(0,1,length.out=5))
}
x= which(abs(diff(diffr1))/diffr1[-1] > rel)[1]/length(diffr1)
if(x<=0.50){
message("Default value being used.")
x = 0.50
}
if(class(obj)=="MRexperiment"){
obj@expSummary\$cumNormStat = x;
}
return(x)
}
```