.packageName <- "Mfuzz"
acore <-  function(eset,cl,min.acore=0.5){

  atmp <- list(NULL)
  
  for (i in 1:dim(cl[[1]])[[1]]){
    index <- (cl[[3]]==i & (cl[[4]][,i] > min.acore)) # selection of genes
   atmp[[i]] <- data.frame(NAME=dimnames(exprs(eset))[[1]][index],MEM.SHIP=cl[[4]][index,i])
  }

atmp
      }
cselection <- function(eset,m,crange=seq(4,32,4),repeats=5,visu=TRUE,...){ 

Nonempty <- matrix(0,ncol=length(crange),nrow=repeats) 
i <- 0
for (c in crange){
  i <- i +1
  for (ii in  1:repeats){
  Utmp <- mfuzz(eset,centers=c,m=m)[[4]]#,...)[[4]]
   for (jj in 1:dim(Utmp)[[2]]){
     if((sum(Utmp[,jj] > 0.5))> 0){
       Nonempty[ii,i] <-  Nonempty[ii,i] + 1
     }
   }
 }
}
dimnames(Nonempty) <- list(paste("repeats:",c(1:5),sep=""),paste("c:",crange,sep=""))
if (visu){
plot(crange,Nonempty[1,],pch="x")
for (i in 1:dim(Nonempty)[[1]]) points(crange,Nonempty[i,],pch="x")
lines(c(0,max(crange)),c(0,max(crange)),col="red")
}
Nonempty
}

fill.NA <- function(eset,mode="mean",k=10){
data <- exprs(eset)
  if (mode=="mean"){
   for (i in 1:dim(data)[[1]]){
      data[i,is.na(data[i,])] <- mean(data[i,],na.rm=TRUE)
    }
 }
 
 if (mode=="median"){
    for (i in 1:dim(data)[[1]]){
      data[i,is.na(data[i,])] <- median(data[i,],na.rm=TRUE)
    }  
 }

if (mode=="knn"){
datatmp <- data
  for (i in 1:dim(data)[[1]]){
        if (any(is.na(data[i,]))){
           dt1 <- matrix(data[i,],nrow = dim(data)[[1]],ncol = dim(data)[[2]],byrow =TRUE)        
           D <- sqrt(t(apply((dt1 - datatmp )^2,1,sum, na.rm =TRUE )))  
           nn <- order(D)[2:(k+1)]
           data[i,is.na(data[i,])] <-  apply(t(as.matrix(data[nn,which(is.na(data[i,]))])),1,"mean",na.rm=TRUE)
         }
      }
     }

if (mode=="knnw"){
datatmp <- data
       for(i in 1:dim(data)[[1]]) {
         if (any(is.na(data[i,]))){
           dt1 <- matrix(data[i,],nrow = dim(data)[[1]],ncol = dim(data)[[2]],byrow =TRUE)        
           gene.dist   <- sqrt(t(apply((dt1 - datatmp)^2,1,sum, na.rm =TRUE )))  
           w <- sort(gene.dist)[2:(1+k)]
           W <- 1/w
           W  <- W/sum(W, na.rm = TRUE)
           data[i, is.na(data[i,])] <-  apply(as.matrix(W*data[order(gene.dist)[2:(1+k)],is.na(data[i,])]), 2, sum, na.rm =  TRUE)
         }
       }
     }

exprs(eset) <- data
eset
}   
 

filter.NA <- function(eset,thres=0.25){

index <- logical(dim(exprs(eset))[1])

  for (i in 1:dim(exprs(eset))[1]){
     index[i] <- (((sum(is.na(exprs(eset)[i,]))/dim(exprs(eset))[2])) > thres)  
  }
 cat(paste(sum(index),"genes excluded.\n"))

 eset[!index,]
}

  
filter.std <- function (eset, min.std,visu=TRUE){
  #index <- logical(dim(exprs(eset))[1])
  tmp <- logical(dim(exprs(eset))[1])
  if (is.numeric(min.std)){ 
    data <- exprs(eset)
    for (i in 1:length(tmp)){
      tmp[i]   <- sd(data[i,],na.rm=TRUE)
   #   index[i]  <- ( tmp[i] > min.std)
   
    }
     index <- tmp > min.std
     index[is.na(index)] <- TRUE
    cat(paste(sum(!index),"genes excluded.\n"))
}
  
 
  if (visu){
    plot(sort(tmp),xlab="Ordered genes",ylab="Sd")
  }
 eset[index,]
}



kmeans2 <- function(eset,k,iter.max=100){
 cl<-kmeans(exprs(eset),centers=k,iter.max=iter.max)
}
kmeans2.plot <- function(eset,kl,mfrow=c(1,1)){
clusterindex <- kl[[1]]

for (j in 1:max(clusterindex)){
  tmp <- exprs(eset)[clusterindex==j,]
 
  if (((j-1)%% (mfrow[1] * mfrow[2]))==0){
  X11()
  par(mfrow=mfrow)
  plot.default(x=NA,xlim=c(1,dim(exprs(eset))[[2]]), ylim= c(min(tmp),max(tmp)),
              xlab="Time",ylab="Expression",main=paste("Cluster",j))
 
  } else {
    plot.default(x=NA,xlim=c(1,dim(exprs(eset))[[2]]), ylim= c(min(tmp),max(tmp)),
              xlab="Time",ylab="Expression",main=paste("Cluster",j))
  }
    

  for (jj in 1:dim(tmp)[[1]]){ 
  lines(tmp[jj,],col="black")
}
}
}
mfuzz <- function(eset,centers,m,...){

cl<-cmeans(exprs(eset),centers=centers,method="cmeans",m=m,...)


}
mfuzz.plot <- function(eset,cl,mfrow=c(1,1),colo,min.mem = 0,time.labels,new.window=TRUE){
# function for plotting the clusters 
clusterindex <- cl[[3]]
memship <- cl[[4]]
memship[memship < min.mem] <- -1 
colorindex <- integer(dim(exprs(eset))[[1]])
if (missing(colo)){
  colo <- c("#FF8F00",
            "#FFA700", "#FFBF00", "#FFD700", "#FFEF00", "#F7FF00", "#DFFF00", "#C7FF00",
            "#AFFF00", "#97FF00", "#80FF00", "#68FF00", "#50FF00", "#38FF00", "#20FF00",
            "#08FF00", "#00FF10", "#00FF28", "#00FF40", "#00FF58", "#00FF70", "#00FF87",
            "#00FF9F", "#00FFB7", "#00FFCF", "#00FFE7", "#00FFFF", "#00E7FF", "#00CFFF",
            "#00B7FF", "#009FFF", "#0087FF", "#0070FF", "#0058FF", "#0040FF", "#0028FF",
            "#0010FF", "#0800FF", "#2000FF", "#3800FF", "#5000FF", "#6800FF", "#8000FF",
            "#9700FF", "#AF00FF", "#C700FF", "#DF00FF", "#F700FF", "#FF00EF", "#FF00D7",
            "#FF00BF", "#FF00A7", "#FF008F", "#FF0078", "#FF0060", "#FF0048", "#FF0030",
            "#FF0018")

  }

colorseq <- seq(0,1,length=length(colo))


for (j in 1:max(clusterindex)){
  tmp <- exprs(eset)[clusterindex==j,]
  tmpmem <- memship[clusterindex==j,j]

  if (((j-1)%% (mfrow[1] * mfrow[2]))==0){

  if (new.window) X11()
   par(mfrow=mfrow)
  
  if (sum(clusterindex==j)==0) {
     ymin <- -1; ymax <- +1;
   } else {
     ymin <- min(tmp);ymax <- max(tmp);    
   }
  
  plot.default(x=NA,xlim=c(1,dim(exprs(eset))[[2]]), ylim= c(ymin,ymax),
              xlab="Time",ylab="Expression changes",main=paste("Cluster",j),axes=FALSE)
  if (missing(time.labels)){
  axis(1, 1:dim(exprs(eset))[[2]],c(1:dim(exprs(eset))[[2]]))
  axis(2)
} else {
  axis(1, 1:dim(exprs(eset))[[2]],time.labels)
  axis(2)
} 
  

   } else {
   
  if (sum(clusterindex==j)==0) {
     ymin <- -1; ymax <- +1;
   } else {
     ymin <- min(tmp);ymax <- max(tmp);    
   }
  
  
    plot.default(x=NA,xlim=c(1,dim(exprs(eset))[[2]]), ylim= c(ymin,ymax),
              xlab="Time",ylab="Expression changes",main=paste("Cluster",j),axes=FALSE)

    if (missing(time.labels)){
  axis(1, 1:dim(exprs(eset))[[2]],c(1:dim(exprs(eset))[[2]]))
  axis(2)
} else {
  axis(1, 1:dim(exprs(eset))[[2]],time.labels)
  axis(2)
} 
  

  }
    
   
if (!(sum(clusterindex==j)==0)){
  for (jj in 1:(length(colorseq)-1)){
    tmpcol <- (tmpmem >= colorseq[jj] & tmpmem <= colorseq[jj+1])
    if (sum(tmpcol)> 0) {
    tmpind <- which(tmpcol)
        for (k in 1:length(tmpind)){
         lines(tmp[tmpind[k],],col=colo[jj])
       }
  }
  }}
}
}
mfuzzColorBar <- function(col, horizontal=FALSE){

require(marray) || stop("Library marray is required")

if (missing(col)){
col <- c( "#FF8F00", "#FFA700", "#FFBF00",
            "#FFD700", "#FFEF00", "#F7FF00", "#DFFF00", "#C7FF00",
            "#AFFF00", "#97FF00", "#80FF00", "#68FF00", "#50FF00",
            "#38FF00", "#20FF00", "#08FF00", "#00FF10", "#00FF28",
            "#00FF40", "#00FF58", "#00FF70", "#00FF87", "#00FF9F",
            "#00FFB7", "#00FFCF", "#00FFE7", "#00FFFF", "#00E7FF",
            "#00CFFF", "#00B7FF", "#009FFF", "#0087FF", "#0070FF",
            "#0058FF", "#0040FF", "#0028FF", "#0010FF", "#0800FF",
            "#2000FF", "#3800FF", "#5000FF", "#6800FF", "#8000FF",
            "#9700FF", "#AF00FF", "#C700FF", "#DF00FF", "#F700FF",
            "#FF00EF", "#FF00D7", "#FF00BF", "#FF00A7", "#FF008F",
            "#FF0078", "#FF0060", "#FF0048", "#FF0030", "#FF0018")

}
maColorBar(seq(0,1,0.01), col=col, horizontal=FALSE)

}
overlap <- function(cl){
  O <- matrix(NA,nrow=dim(cl[[4]])[2],ncol=dim(cl[[4]])[2])
  for (i in 1:dim(cl[[4]])[2]){
    for (j in 1:dim(cl[[4]])[2]){
      O[i,j] <-  sum(cl[[4]][,i]*cl[[4]][,j])
    }
     }
  for (i in 1:dim(O)[[2]]){
    O[,i] <- O[,i]/sum(O[,i])
  }
O
}
overlap.plot <- function(cl,overlap,thres=0.1,scale=TRUE,magni=30,P=NULL){
  
     x <- prcomp(cl[[1]],scale=TRUE)
   if (!missing(P)){
         x[[2]] <- P
     }
   x[[5]] <- t(t(x[[2]])%*% t(cl[[1]]))
   plot(x[[5]][,1],x[[5]][,2],xlab="PC1",ylab="PC2",type="n")
  
   for (i in 1:dim(x[[5]])[[1]]){
     for (j in 1:dim(x[[5]])[[1]]){
       if (thres < overlap[i,j]){
         lines(c(x[[5]][i,1],x[[5]][j,1]),c(x[[5]][i,2],x[[5]][j,2]),col="blue",lwd=magni*overlap[i,j])
       }
     }
   }
  for (i in 1:dim(x[[5]])[[1]]){
     points(x[[5]][i,1],x[[5]][i,2],pch=20,cex=4,col="red",lwd=2)
     points(x[[5]][i,1],x[[5]][i,2],pch=21,cex=4,col="red",lwd=2)
     text(x[[5]][i,1],x[[5]][i,2],i,font=2)
   }
   
x[[2]]
}

       
partcoef <- function(eset,crange=seq(4,32,4),mrange=seq(1.05,2,0.1),...){

  F <- matrix(NA,nrow=length(crange),ncol=length(mrange))
  F.n <- matrix(NA,nrow=length(crange),ncol=length(mrange))
  F.min <-  matrix(NA,nrow=length(crange),ncol=length(mrange))
  i=j=0;
  for (c in crange){
    i=i+1;j =0;
    for (m in mrange){
      j=j+1;
      Utmp <- mfuzz(eset,centers=c,m=m,...)[[4]]
      F[i,j] <- sum(Utmp^2)/(dim(Utmp)[[1]]*dim(Utmp)[[2]])
      F.min[i,j] <-  (1/c^2)
      F.n[i,j] <- F[i,j]- F.min[i,j]
    }
  }
dimnames(F) <- list(paste("c:",crange,sep=""),paste("m:",mrange,sep=""))
dimnames(F.n) <- list(paste("c:",crange,sep=""),paste("m:",mrange,sep="")) 
dimnames(F.min) <- list(paste("c:",crange,sep=""),paste("m:",mrange,sep="")) 
  
return(list(F,F.n,F.min))
}

randomise <- function(eset){
  data <- exprs(eset)
  dataR <- matrix(NA,ncol=dim(data)[[2]],nrow=dim(data)[[1]])
  
for (i in 1:dim(data)[[1]]){
     dataR[i,] <- data[i,sample(dim(data)[[2]])]
}

exprs(eset) <- dataR
eset
}
standardise <- function(eset){
  data <- exprs(eset)
  for (i in 1:dim(data)[[1]]){
    data[i,] <- (data[i,] - mean(data[i,],na.rm=TRUE))/sd(data[i,],na.rm=TRUE) 
  }
exprs(eset) <- data
  eset
}
standardise2 <- function(eset,timepoint=1){
  data <- exprs(eset)
  for (i in 1:dim(data)[[1]]){
    data[i,] <- (data[i,] - data[i,timepoint])/sd(data[i,],na.rm=TRUE) 
  }
exprs(eset) <- data
  eset
}
top.count <- function(cl) {
memship <- cl[[4]]
gene.num <- dim(memship)[[1]]
count <- integer(length=gene.num)
count[] <- 0
for(i in 1:dim(memship)[[2]]) {
y <- (max(memship[,i]) <= memship[,i])
index <- which(y)
count[index] <- count[index] + 1
}
return(count)
}
 
