.packageName <- "factDesign"
contrastTest <- function(model,lambda,cVec=NA,p=.01){
  if(is.na(cVec)) cVec <- rep(0,dim(lambda)[1])

  betahat <- coef(model)
  XpXinv <- summary(model)$cov.unscaled
  sigmahat <- summary(model)$sigma

  df1 <- dim(lambda)[1]
  df2 <- summary(model)$df[2]

  cEst <- lambda %*% betahat
  
  Fstat <- (t(cEst - cVec) %*%
             solve(lambda %*% XpXinv %*% t(lambda)) %*%
             (cEst - cVec))/(df1 * sigmahat^2)
  
  pvalue <- 1-pf(Fstat,df1,df2)
  if(pvalue<p) test <- "REJECT"
  else test <-"FAIL TO REJECT"

  return(list(test=test,Fstat=Fstat,pvalue=pvalue,cEst=cEst))
}
findFC <- function(model,lambdaNum,lambdaDenom,logbase=NULL){
  if(is.null(logbase)){
	num <- lambdaNum %*% coef(model)
  	denom <- lambdaDenom %*% coef(model)
  	FC <- num/denom
  }
  else {	
	lambdaDiff <- lambdaNum-lambdaDenom	

	if(logbase=="exp"){
		FC <- exp(lambdaDiff %*% coef(model))
	}
	else FC <- logbase^(lambdaDiff %*% coef(model))
  }

  return(FC)
}

kRepsOverA <- function(k,A=100,INDEX)
{
  function(x){
    temp <- tapply(x,INDEX,FUN=mean)
    ans <- sum(temp > A) >= k
    return(ans)
  }
}

madOutPair <- function(x,whichPair,c=4){

  lb <- median(x)-c*mad(x)
  ub <- median(x)+c*mad(x)

  test1 <- (x[whichPair[1]] > ub) |  (x[whichPair[1]] < lb)
  test2 <- (x[whichPair[2]] > ub) |  (x[whichPair[2]] < lb)

  singleOut <- NA	  
  if(xor(test1,test2)){
    singleOut <- whichPair[which.max(c(test1,test2))]
  }

  return(singleOut)
    
}

  


outlierPair <- function(x,INDEX,p=.05,na.rm=TRUE){
  
  xSplit <- split(x,INDEX)
  n <- length(x)/2

  d <- lapply(xSplit,FUN="diff")
  d <- unlist(d,use.names=FALSE)
  
  dSqMax <- max(d^2)
  fval <- dSqMax/((sum(d^2)-dSqMax)/(n-1))
  pval <- n * (1-pf(fval,1,n-1))
  test <- (pval<p)

  whichMax <- which.max(d^2)
  whichPair <- which(x %in% xSplit[[whichMax]])

  return(list(test=test,pval=pval,whichPair=whichPair))
}

## examples 
## data(estrogen)
## no single outlier
## outlierPair(exprs(estrogen)[1,],INDEX=pData(estrogen),p=.05)
## true single outlier
## outlierPair(exprs(estrogen)[247,],INDEX=pData(estrogen),p=.05)
## an outlier Pair, but would not pass madOutPair
## outlierPair(exprs(estrogen)[495,],INDEX=pData(estrogen),p=.05)








par2lambda <- function(betaNames,betas,coefs){

  lambda <- matrix(0,length(betas),length(betaNames))
  colnames(lambda) <- betaNames
  for (i in 1:length(betas)){

	lambda[i,betas[[i]]] <- coefs[[i]]
  
  }	
  
  return(lambda)
}

.First.lib <- function(libname, pkgname, where) {
   require(affy) || stop("Need package affy")
}
