.packageName <- "RefPlus"
"colMedians" <-
function(mat) rowMedians(t(mat))

"normalize.quantiles2" <-
function(X,Reference.Quantiles){
##Quantile nomralization to a reference set
apply(X,2,function(x,y) y[rank(x)],Reference.Quantiles)
}

"rma.para" <-
function(Train, bg=TRUE, exp=FALSE){
##Obtain reference quantiles, reference probe effects based on
##reference set Train

expression<-numeric(0)
if (bg == TRUE) Train=bg.correct.rma(Train)      ##if yes, background correction
PM<-pm(Train)
core<-rowMeans(apply(PM,2,sort))
PM<-normalize.quantiles(PM);
pm(Train)<-PM
rm(PM)

Pset<- rmaPLM(Train,normalize=FALSE,background=FALSE,output.param=list(
weights=FALSE,varcov="none",residuals=FALSE,resid.SE=FALSE))
##Here we use R2.1.0, where probe.coefs is a list.
##In R.2.0.1, probe.coefs is a vector
R<-coefs.probe(Pset)
if (exp == TRUE) expression<-coefs(Pset)        ##if yes, return gene expression
return(list(Reference.Quantiles=core,probe.effects=R,expression=expression))
}

"rmaplus" <-
function(Future, rmapara, r.q, p.e, bg=TRUE){
## Derive RMA+ expression.


if (missing(r.q)&(missing(rmapara))) {
  stop("Missing Reference Quantiles")
}
if (missing(p.e)&(missing(rmapara))) {
  stop("missing Probe Effects")
}

if (!missing(rmapara)){
r.q=rmapara[[1]]
p.e=rmapara[[2]]
cat("Use rmapara.\n")
} else
{
  cat("Use Reference.Quantiles and Probe.Effects.\n")
}

if (bg == TRUE) Future<-bg.correct.rma(Future)   ##if yes, background correction
PM=pm(Future)
pm(Future)<-normalize.quantiles2(PM,r.q)
rm(PM)
future<-rmaref.predict(Future,p.e)
return(future)
}

"rmaref.predict" <-
function(Future,p.e){
## Derive RMA+ expression.
PMindex<-pmindex(Future)
PM<-log2(pm(Future))
PM<-sweep(PM,1,unlist(p.e))
pm(Future)<-PM
PMlist<-lapply(PMindex,function(x,y) intensity(y)[x,],Future)
future<-t(sapply(PMlist,colMedians))
colnames(future)<-sampleNames(Future)
return(future)
}

